asp.net-mvc-3 – 在Post上,下拉列表SelectList.SelectedValue为
发布时间:2020-12-16 04:01:50 所属栏目:asp.Net 来源:网络整理
导读:我的模型如下: public class testCreateModel{ public string s1 { get; set; } public SelectList DL { get; set; } public testCreateModel() { Dictionarystring,string items = new Dictionarystring,string(); items.Add("1","Item 1"); items.Add("2"
我的模型如下:
public class testCreateModel { public string s1 { get; set; } public SelectList DL { get; set; } public testCreateModel() { Dictionary<string,string> items = new Dictionary<string,string>(); items.Add("1","Item 1"); items.Add("2","Item 2"); DL = new SelectList(items,"Key","Value"); } } 我的启动行动是: public ActionResult testCreate() { testCreateModel model = new testCreateModel(); return View(model); } 我的剃刀视图(删除了相关部分)是: @model Tasks.Models.testCreateModel @using (Html.BeginForm()) { <fieldset> <legend>testCreateModel</legend> <div class="editor-label"> @Html.LabelFor(model => model.s1) </div> <div class="editor-field"> @Html.EditorFor(model => model.s1) </div> <div class="editor-label"> Select an item: </div> <div class="editor-field"> @Html.DropDownList("dropdownlist",(SelectList)Model.DL) </div> <p> <input type="submit" value="Create" /> </p> </fieldset> } 回发行动是: public ActionResult testCreate(testCreateModel model,FormCollection collection) { if (ModelState.IsValid) { Console.WriteLine("SelectedValue: ",model.DL.SelectedValue); Console.WriteLine("FormCollection:",collection["dropdownlist"]); // update database here... } return View(model); } 在回发后,model.DL.SelectedValue为null. (但是,可以从FormCollection中获取所选项目,但这不是重点). DL对象仍然正确填充,否则,立即窗口输出如下: model.DL {System.Web.Mvc.SelectList} base {System.Web.Mvc.MultiSelectList}: {System.Web.Mvc.SelectList} SelectedValue: null model.DL.Items Count = 2 [0]: {[1,Item 1]} [1]: {[2,Item 2]} model.DL.SelectedValue null Q1:如何使用SelectedValue属性? 现在,如果在Razor视图中我将Html SELECT标记的名称更改为DL(即与模型中的属性名称相同): @Html.DropDownList("DL",(SelectList)Model.DL) 我得到一个例外: No parameterless constructor defined for this object. Stack Trace: [MissingMethodException: No parameterless constructor defined for this object.] System.RuntimeTypeHandle.CreateInstance(RuntimeType type,Boolean publicOnly,Boolean noCheck,Boolean& canBeCached,RuntimeMethodHandleInternal& ctor,Boolean& bNeedSecurityCheck) +0 System.RuntimeType.CreateInstanceSlow(Boolean publicOnly,Boolean skipCheckThis,Boolean fillCache) +98 System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly,Boolean skipVisibilityChecks,Boolean fillCache) +241 System.Activator.CreateInstance(Type type,Boolean nonPublic) +69 System.Web.Mvc.DefaultModelBinder.CreateModel(ControllerContext controllerContext,ModelBindingContext bindingContext,Type modelType) +199 System.Web.Mvc.DefaultModelBinder.BindSimpleModel(ControllerContext controllerContext,ValueProviderResult ... Q2:为什么? 谢谢. 解决方法
MVC将仅返回POST中所选选项的值,因此您需要一个属性来包含返回的单个值.
作为一个好建议,尝试通过ViewBag设置SelectLists,这有助于保持ViewModel不受需要填充表单的数据的影响. 所以你的例子可以像这样解决: public class testCreateModel { public string s1 { get; set; } public int SelectedValue { get; set; } } 并在您的视图中执行此操作: @Html.DropDownList("SelectedValue",(SelectList)ViewBag.DL) 在您的GET操作中填充ViewBag.DL之前. 至于你的Q2,默认的ModelBinder要求所有要绑定的类型都有一个默认的构造函数(以便ModelBinder可以创建它们) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 检测asp.net webform中的移动版本 – c#
- asp.net-mvc – DNX vs DNX Core
- asp.net-mvc – 不显眼的验证不适用于Ajax.BeginForm
- asp.net-mvc – MVC 4中app.config的等价物
- iis-7.5 – 使用虚拟目录/应用程序在IIS中托管ASP.NET 5 We
- 无法启动ASP.NET Development服务器,因为正在使用端口“190
- asp.net-core – Asp.Net 5中的自定义ClaimsPrincipal(Mvc
- asp.net – 如何单元测试使用HostingEnvironment.MapPath的
- asp.net-mvc – asp.net mvc – 完全关闭DB中的自定义字段构
- IIS上的ASP.NET Core 2.0错误502.5
推荐文章
站长推荐
- asp.net-mvc – 使用CSVHelper将流输出到浏览器
- asp.net – JSON在IE7中未定义
- ASP.NET Core 基础教程 - ASP.NET Core 基础教程
- asp.net-mvc – .Net 4.5.1框架的maxRequestLeng
- asp.net-mvc – ASP.Net MVC2自定义模板通过Ajax
- asp.net-mvc-3 – Razor in-line if语句不工作?
- Asp.Net Mvc – 用JQuery替换Ajax.ActionLink
- 在Asp.Net Core中使用TempData时无法重定向到操作
- asp.net-mvc-3 – 为什么Html.Label()不适用于句
- iis – 在Asp.net核心应用程序中与SignalR 2.2.1
热点阅读