我正在研究ASP.NET MVC-4 Web应用程序。我在 Action 方法中定义以下内容以构建SelectList
:
ViewBag.CustomerID = new SelectList(db.CustomerSyncs, "CustomerID", "Name");
然后我在
DropDownListFor
中渲染我的View
,如下所示: @Html.DropDownListFor(model => model.CustomerID, (SelectList)ViewBag.CustomerID, "please select")
如图所示,我将
ViewBag
属性命名为等于Model
属性名称,即CustomerID
。通过我自己的测试,定义相同的名称不会引起任何问题或冲突,但是我应该避免这种情况吗? 最佳答案
您不应为model属性和ViewBag
属性使用相同的名称(理想情况下,根本不应该使用ViewBag
,而应使用具有IEnumerable<SelectListItem>
属性的 View 模型)。
使用@Html.DropDownListFor(m => m.CustomerId, ....)
时,即使已设置model属性的值并匹配其中一个选项,也将始终选择第一个"Please Select"
选项。原因是该方法首先根据您提供的IEnumerable<SelectListItem>
生成一个新的Selected
,以设置Selected
属性的值。为了设置CustomerID
属性,它从ViewData
中读取"IEnumerable<SelectListItem>"
的值,并且找到的第一个是@Html.DropDownList("CustomerId", ....)
(不是model属性的值),并且无法将该字符串与您的任何选项匹配,因此第一个选项是被选中(因为必须进行某些操作)。
使用data-val-*
时,不会生成ViewBag
属性,并且您将不会获得任何客户端验证
请参阅this DotNetFiddle,其中显示了可能的用例比较。只有对model属性和ojit_code属性使用不同的名称,它们才能正常工作。
关于asp.net - ViewBag名称可以与DropDownList中的Model属性名称相同吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37161202/