ViewBag名称可以与DropDownList中的Model属性名称相同吗?

时间:2016-05-11 11:25:11

标签: asp.net asp.net-mvc asp.net-mvc-4 html-helper html.dropdownlistfor

我正在开发一个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。根据我自己的测试,定义相同名称并没有引起任何问题或冲突,但我应该避免这种情况吗?

2 个答案:

答案 0 :(得分:13)

您不应对模型属性和ViewBag属性使用相同的名称(理想情况下,您根本不应使用ViewBag,而是使用IEnumerable<SelectListItem>的视图模型属性)。

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

使用data-val-*时,不会生成ViewBag个属性,也不会获得任何客户端验证

参考this DotNetFiddle,显示可能的用例比较。只有为model属性和cp /home/1R143D1B/1R143D1B.file /newfolder属性使用不同的名称才能正常工作。

答案 1 :(得分:1)

There is not harm to use it. You will not get any error. but best practice is to bind model property.