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
属性 使用不同的名称才能正常工作。
我正在开发 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
属性 使用不同的名称才能正常工作。