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

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 属性 命名为 Model 属性 名称 CustomerID。根据我自己的测试,定义相同的名称不会导致任何问题或冲突,但我应该避免这种情况吗?

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

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

的视图模型

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

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

参考 this DotNetFiddle 显示可能用例的比较。只有为模型 属性 和 ViewBag 属性 使用不同的名称才能正常工作。