asp.net - 在DropDownList中,ASP.NET的ViewBag名称与模型属性名的名称相同?

  显示原文与译文双语对照的内容
52 2

我正在使用 ASP.NET mvc-4 web应用程序。我在操作方法中定义了以下内容来构建 SelectList:

ViewBag.CustomerID = new SelectList(db.CustomerSyncs,"CustomerID","Name");

然后,我将 DropDownListFor 呈现在我的View 中:

 @Html.DropDownListFor(model => model.CustomerID, (SelectList)ViewBag.CustomerID,"please select")

如图所示,我将 ViewBag 属性命名为 Model 属性名,它是 CustomerID我自己的测试中定义相同名称不会导致任何问题或者冲突,但应该避免这样做?

时间:原作者:0个回答

85 4

你不应该对模型属性和 ViewBag 属性( 最好是不使用 ViewBag,而是使用 IEnumerable<SelectListItem> 属性的视图模型) 使用相同的名称。

当使用@Html.DropDownListFor(m => m.CustomerId,.. ..)即使已经设置了模型属性的值并匹配其中一个选项,第一个 "Please Select" 选项也将始终被选中。原因是,该方法首先根据你提供的方法生成新的IEnumerable<SelectListItem>,以设置 Selected 属性的值。为了设置 Selected 属性,它从 ViewData 读取 CustomerID的值,第一个查找的值是"IEnumerable<SelectListItem>"( 不是模型属性的值),且不能与你的任何选项匹配该字符串,所以选择了( 因为必须要) 。

当使用@Html.DropDownList("CustomerId",.. ..)将不会生成 data-val-* 属性,也不会得到任何客户端验证

参考这个 DotNetFiddle 展示可能的用例的比较。只有对模型属性使用不同名称,并且 ViewBag 属性才能正常工作。

原作者:
86 4

使用它并没有坏处。你不会收到任何错误。但是最佳做法是绑定模型属性。

原作者:
...