Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net ViewBag名称能否与DropDownList中的模型属性名称相同?_Asp.net_Asp.net Mvc_Asp.net Mvc 4_Html Helper_Html.dropdownlistfor - Fatal编程技术网

Asp.net ViewBag名称能否与DropDownList中的模型属性名称相同?

Asp.net ViewBag名称能否与DropDownList中的模型属性名称相同?,asp.net,asp.net-mvc,asp.net-mvc-4,html-helper,html.dropdownlistfor,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,如下所示: @Html.DropDownListFor(model => model.CustomerID, (SelectList)ViewBag.Cu

我正在开发一个ASP.NET MVC-4 web应用程序。我在我的操作方法中定义了以下内容,以构建
SelectList

ViewBag.CustomerID = new SelectList(db.CustomerSyncs, "CustomerID", "Name");
然后,我在我的
视图中呈现我的
DropDownListFor
,如下所示:

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

如图所示,我将
ViewBag
属性命名为与
Model
属性名称相同,即
CustomerID
。根据我自己的测试,定义相同的名称没有引起任何问题或冲突,但我应该避免吗?

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

模型属性和
ViewBag
属性不应使用相同的名称(理想情况下,不应使用
ViewBag
,而应使用具有
IEnumerable
属性的视图模型)

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

当使用
@Html.DropDownList(“CustomerId”,..)
时,不会生成
数据val-*
属性,并且不会得到任何客户端验证


请参阅显示可能用例的比较。只有为model属性和ViewBag属性使用不同的名称,它才能正常工作。

不要这样做-这会导致问题(例如,您无法获得任何客户端验证)@StephenMuecke为什么我无法获得任何客户端验证。。。。现在我将customerID设置为int,这是必需的。默认情况下,我得到了客户端验证,当用户尝试提交表单时,他将得到一个错误,即需要CustomerID。。。因此,我不确定我无法获得任何客户端验证是什么意思……另一个问题是,如果在控制器中设置了
CustomerID
的值(即编辑和现有实体),它将无法在下拉列表中正确选择。@StephenMuecke正在重新运行客户端验证。。现在“请选择”的值将为空,因此客户端验证仍将有效。。这是标记,请选择CustomerA@SeM,绝对不是。您将无法获得客户端验证。@US3-57384您能提供更多信息吗?请参阅我在代码中使用的内容。这解决了您的问题,效果很好。(IEnumerable)当我单击提交按钮时,小提琴中的ViewBag.RTError。它表示“具有键'CustomerA'的ViewData项的类型为'System.Int32',但必须为'IEnumerable'。@Saurabh,这是因为在返回视图之前,我没有在POST方法中重新填充
SelectList
(按照GET方法)-但这并不是问题的关键-它表明,如果绑定到的属性和
选择列表
使用相同的名称,则无法获得正确的双向绑定和/或验证(如果您想了解有关该错误的更多详细信息,请参阅