Asp.net-Mvc-3

ASP.NET MVC DropDownListFor 不從模型中選擇值

  • April 4, 2017

我正在使用 ASP.NET MVC 3,只是使用DropDownListForHTML Helper 遇到了一個“問題”。

我在我的控制器中這樣做:

ViewBag.ShippingTypes = this.SelectListDataRepository.GetShippingTypes();

GetShippingTypes方法:

public SelectList GetShippingTypes()
{
   List<ShippingTypeDto> shippingTypes = this._orderService.GetShippingTypes();

   return new SelectList(shippingTypes, "Id", "Name");
}

我把它放在模型中ViewBag而不是模型中的原因(我對每個視圖都有強類型模型),是因為我有一個使用 EditorTemplate 呈現的項目集合,它還需要訪問 ShippingTypes 選擇列表。

否則我需要遍歷整個集合,然後分配一個 ShippingTypes 屬性。

到目前為止,一切都很好。

在我看來,我這樣做:

@Html.DropDownListFor(m => m.RequiredShippingTypeId, ViewBag.ShippingTypes as SelectList)

RequiredShippingTypeId是類型Int32

發生的情況是,下拉列表RequiredShippingTypeId未選擇 的值。

我遇到了這個:http ://web.archive.org/web/20090628135923/http://blog.benhartonline.com/post/2008/11/24/ASPNET-MVC-SelectList-selectedValue-Gotcha.aspx

ViewData他建議,當選擇列表來自時,MVC 將從 中查找所選值ViewData。我不確定情況是否如此,因為部落格文章很舊而且他在談論 MVC 1 beta。

解決此問題的解決方法是:

@Html.DropDownListFor(m => m.RequiredShippingTypeId, new SelectList(ViewBag.ShippingTypes as IEnumerable<SelectListItem>, "Value", "Text", Model.RequiredShippingTypeId.ToString()))

最後我試著不ToString打開RequiredShippingTypeId,這給了我和以前一樣的行為:沒有選擇項目。

我認為這是一個數據類型問題。最終,HTML 助手將字元串(在選擇列表中)與Int32(來自RequiredShippingTypeId)進行比較。

ViewBag但是,為什麼將 SelectList 放入- 當它在將其添加到模型時完美工作時它不起作用,並在視圖中執行此操作:

@Html.DropDownListFor(m => m.Product.RequiredShippingTypeId, Model.ShippingTypes)

這不起作用的原因是由於助手的限制:只有當這個 lambda 表達式是一個簡單的屬性訪問表達式DropDownListFor時,它才能使用作為第一個參數傳遞的 lambda 表達式來推斷選定的值。例如,這不適用於數組索引器訪問表達式,這是您的情況,因為編輯器模板。

你基本上有(不包括編輯器模板):

@Html.DropDownListFor(
   m => m.ShippingTypes[i].RequiredShippingTypeId, 
   ViewBag.ShippingTypes as IEnumerable<SelectListItem>
)

不支持以下內容:m => m.ShippingTypes[i].RequiredShippingTypeId。它僅適用於簡單的屬性訪問表達式,但不適用於索引集合訪問。

您找到的解決方法是解決此問題的正確方法,方法是在建構SelectList.

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