我正在研究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> 属性)。
使用时 @Html.DropDownListFor(m => m.CustomerId, ....) 首先 "Please Select" 即使已设置model属性的值并且与其中一个选项匹配,也始终会选择该选项。原因是该方法首先生成一个新的 IEnumerable<SelectListItem> 基于您提供的那个来设置值 Selected 属性。为了设置 Selected 属性,它读取的值 CustomerID 从 ViewData,它找到的第一个是 "IEnumerable<SelectListItem>" (不是model属性的值)并且不能将该字符串与任何选项匹配,因此选择了第一个选项(因为必须要有)。
使用时 @Html.DropDownList("CustomerId", ....)不,不 data-val-* 将生成属性,您将无法获得任何客户端验证
参考 这个DotNetFiddle 显示可能的用例的比较。只为模型属性和使用不同的名称 ViewBag 财产将全部正常运作。
使用它没有害处。你不会得到任何错误。但最佳做法是绑定模型属性。