Asp.net

ViewBag 名稱可以與 DropDownList 中的 Model 屬性名稱相同嗎?

  • May 2, 2017

我正在開發一個 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. 根據我自己的測試,定義相同的名稱不會導致任何問題或衝突,但我應該避免這種情況嗎?

您不應該為模型屬性和ViewBag屬性使用相同的名稱(理想情況下,您根本不應該使用ViewBag,而應該使用具有IEnumerable<SelectListItem>屬性的視圖模型)。

使用@Html.DropDownListFor(m => m.CustomerId, ....)第一個"Please Select"選項時,即使模型屬性的值已設置並匹配其中一個選項,也將始終選中。原因是該方法首先IEnumerable<SelectListItem>根據您提供的方法生成一個新的,以便設置Selected屬性的值。為了設置Selected屬性,它讀取CustomerIDfrom的值,ViewData它找到的第一個是"IEnumerable<SelectListItem>"(不是模型屬性的值)並且無法將該字元串與您的任何選項匹配,因此選擇了第一個選項(因為某些必須)。

使用時@Html.DropDownList("CustomerId", ....),不會data-val-*生成任何屬性,也不會得到任何客戶端驗證

請參閱此 DotNetFiddle顯示可能案例的比較。只有對模型屬性和ViewBag屬性使用不同的名稱,它才能正常工作。

引用自:https://stackoverflow.com/questions/37161202