[英]ASP.NET Core + Client Side Validation: No data-val-* attributes are generated if ViewBag and Model has same property name
[英]Can the ViewBag name be the same as the Model property name in a DropDownList?
我正在开发一个 ASP.NET MVC-4 Web 应用程序。 我在我的操作方法中定义以下内容来构建SelectList
:
ViewBag.CustomerID = new SelectList(db.CustomerSyncs, "CustomerID", "Name");
然后我在我的View
渲染我的DropDownListFor
如下:
@Html.DropDownListFor(model => model.CustomerID, (SelectList)ViewBag.CustomerID, "please select")
如图所示,我将ViewBag
属性命名为等于CustomerID
的Model
属性名称。 从我自己的测试来看,定义相同的名称不会导致任何问题或冲突,但我应该避免这种情况吗?
您不应该对模型属性和ViewBag
属性使用相同的名称(理想情况下,您根本不应该使用ViewBag
,而是应该使用具有IEnumerable<SelectListItem>
属性的视图模型)。
使用@Html.DropDownListFor(m => m.CustomerId, ....)
,即使模型属性的值已设置并匹配其中一个选项,也将始终"Please Select"
第一个"Please Select"
选项。 原因是该方法首先根据您提供的值生成一个新的IEnumerable<SelectListItem>
以设置Selected
属性的值。 为了设置Selected
属性,它从ViewData
读取CustomerID
的值,它找到的第一个值是"IEnumerable<SelectListItem>"
(不是模型属性的值),并且无法将该字符串与您的任何选项匹配,所以选择了第一个选项(因为必须有一些东西)。
使用@Html.DropDownList("CustomerId", ....)
,不会生成data-val-*
属性,也不会得到任何客户端验证
请参阅此 DotNetFiddle显示可能用例的比较。 只有对模型属性和ViewBag
属性使用不同的名称,它才能正常工作。
使用它没有坏处。 你不会得到任何错误。 但最佳实践是绑定模型属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.