ASP.NET MVC DropDownListFor 不從模型中選擇值
我正在使用 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中未選擇 的值。
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.