asp.net-mvc – DropDownList不选择SelectList中的选定项
我正在使用ASP.NET MVC3应用程序,我无法在特定的编辑器视图中使用DropDownListFor来处理我的属性.
我的模型是一个人,一个人有一个属性,指定它的“人物类型”. PersonType是一个包含名称/描述和ID的类.我可以通过名为ApplicationSettings的静态/共享类访问应用程序中可用的PersonTypes. 在我的Person的Edit Template视图中,我创建了一个SelectList用于调试目的: @ModelType MyNamespace.Person @Code Dim pTypesSelectList As New SelectList(MyNamespace.ApplicationSettings.PersonTypes,"ID","Name",Model.PersonType.ID) End Code 然后我将此SelectList作为参数提供给DropDownListFor,该DropDownListFor绑定到Person的PersonType属性. 我还打印SelectList中每个项目的Selected属性以进行调试: <div style="text-align: center; margin: 5px 0 0 0;"> <div> @Html.LabelFor(Function(model) model.PersonType) </div> <div> @Html.DropDownListFor(Function(model) model.PersonType,pTypesSelectList) @Html.ValidationMessageFor(Function(model) model.PersonType) <br /> <br /> <!-- The following is debugging code that shows the actual value--> @Model.Type.Name <br /> @Model.Type.ID <br /> <br /> <!--This section is to show that the select list has properly selected the value--> @For Each pitem In pTypesSelectList @<div> @pitem.Text selected: @pitem.Selected </div> Next </div> </div> 该视图绑定到PersonType属性为“Person Type#2”的Person,我希望这个被选中;但是此代码的HTML输出如下所示: <div style="text-align: center; margin: 5px 0 0 0;"> <div> <label for="PersonType">PersonType</label> </div> <div> <select id="PersonType" name="PersonType"> <option value="7e750688-7e00-eeee-0000-007e7506887e">Default Person Type</option> <option value="87e5f686-990e-5151-0151-65fa7506887e">Person Type # 1</option> <option value="a7b91cb6-2048-4b5b-8b60-a1456ba4134a">Person Type # 2</option> <option value="8a147405-8725-4b53-b4b8-3541c2391ca9">Person Type # 3</option> </select> <span class="field-validation-valid" data-valmsg-for="PersonType" data-valmsg-replace="true"></span> <br /> <br /> <!-- The following is debugging code that shows the actual value--> Person Type # 2 <br /> a7b91cb6-2048-4b5b-8b60-a1456ba4134a <br /> <br /> <!--This section is to show that the select list has properly selected the value--> <div> Default Person Type selected: False </div> <div> Person Type # 1 selected: False </div> <div> Person Type # 2 selected: True </div> <div> Person Type # 3 selected: False </div> </div> </div> 如您所见,SelectList中项目的已打印Selected属性显示第3项是“Selected”.但令我发疯的是,与此相对应的选项是Not Selected. 解决方法
通常,除非没有其他选项,否则HTML帮助程序将完全忽略SelectList中的Selected属性.如果DropDownListFor可以通过其他方式找到该值,它将坚持使用该值.
在这种情况下,它将使用model.PersonType(.ToString())的值 – 但这不是您想要的,通过您传递给SelectList的model.PersonType.ID来判断. 更多信息在the answer here. 解决方法 一个应该工作的简单解决方法是设置: ViewData["PersonType"] = model.PersonType.Id. 如果存在,帮助程序首先在ModelState中查找 – 即在POST时.这应该已经有效,因为ModelState [“PersonType”]将填充已发布的实际选定值. 在ModelState之后,它将在ViewData中查找 – 首先使用ViewData [“PersonType”],然后只查看ViewData.Model.PersonType.换句话说,您可以使用直接在ViewData上设置的值“覆盖”模型上的值. 更好(IMO)的解决方案 更通用的“更好的实践”,解决它的方法(也避免使用自定义模型绑定器将POST的ID转换回PersonType)是使用ViewModel而不是在视图中使用完整模型: >拥有PersonTypeID属性 – 而不是PersonType. > VB.NET:Html.DropDownListFor(Function(model)model.PersonTypeID),或 >当表单被POST时,将ViewModel(包括PersonTypeID => PersonType)转换回POST Action中的实际模型. 这似乎更多的工作,但通常在项目中有很多场合需要更多特定于视图的数据表示,以避免过多的内联Razor代码 – 所以从业务对象转换到视图模型,尽管它看起来很像有时多余和反干,往往会让你免于很多麻烦. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ASP.NET内置对象
- Asp.net webForm设置允许表单提交Html的方法
- asp.net-core – ASP.Net 5类库中的EntityFramework命令?
- ASP.NET Core 3.1 WebApi+JWT+Swagger+EntityFrameworkCore
- 在UNC路径上安装ASP.NET应用程序,您认为这可能吗?
- asp.net – 使用Azure redis.cache跨负载均衡服务存储MVC应
- asp.net – 单声道随机CS0006编译错误w / fastcgi-mono-ser
- asp.net-mvc – 无法加载文件或程序集Microsoft.VisualStud
- 选择完成后和提交上传之前的asp.net FileUpload事件
- ASP.NET/IIS中使用的非标准HTTP动词“DEBUG”是什么?
- asp.net-mvc-2 – ASP.NET-MVC2预览1:有任何重大
- asp.net-mvc – 为什么被赋予NoValidate属性?
- asp.net-mvc – Href和Url.Content有什么区别?
- asp.net-mvc – 在ASP.NET MVC项目中访问elmah.a
- asp.net – 如何手动停止kestrel服务器
- ASP.Net Web API在VS中正确显示但提供HTTP500
- 使用asp.net中的Enterprise Library实现日志文件
- asp.net – 无法CoCreate Profiler错误 – 但不使
- asp.net-mvc – MVC3自定义格式化日期的不显眼日
- asp.net-mvc – MS Ajax与jQuery在ASP.NET MVC应