[英]Check if ListBoxFor selectedValues is null before display in view?
在編輯模式下,表單上有許多ListBoxFor元素。 如果字段中記錄了數據,則打開表格時,先前選擇的項目將正確顯示。 如果字段為空,但會引發錯誤,因為items參數不能為null。 有沒有一種方法可以檢查視圖,是否有數據可以使用帶有四個參數的ListBoxFor,但是如果不只使用三個參數,則不包括所選項?
這就是我聲明ListBoxFor的方式:
@Html.ListBoxFor(model => model.IfQualityPoor, new MultiSelectList(ViewBag.IfPoor, "Value", "Text", ViewBag.IfQualityPoorSelected), new { @class = "chosen", multiple = "multiple" })
我正在使用ViewBag傳遞ICollection,該ICollection包含選定的項,因為控制器然后將其加入或拆分字符串以綁定到模型字段。 MultiSelectLists總是對我有問題。
您的問題尚不完全清楚,但是您正在使自己更困難,而不是需要使用ListBoxFor
。 DropDownListFor
或ListBoxFor
是IEnumerable<SelectListItem>
。 Razor將根據ModelState
選擇適當的值。
因此,假設ViewBag.IfPoor
是IEnumerable<SelectListItem>
,則您在視圖中所需ViewBag.IfPoor
就是:
@Html.ListBoxFor(m => m.IfQualityPoor, (IEnumerable<SelectListItem>)ViewBag.IfPoor, new { @class = "chosen" })
正確的選項將根據模型上的IfQualityPoor
值標記為已selected
。 另外,也沒有必要在htmlAttributes
參數中傳遞multiple = "multiple"
,因為僅使用ListBoxFor
而不是DropDownListFor
獲得該參數。
如果使用視圖模型,然后將選項添加為屬性,那就更好了。 然后,您不必擔心在視圖中進行強制轉換,這始終是引入運行時異常的好方法。 例如:
public class FooViewModel
{
...
public IEnumerable<SelectListItem> IfQualityPoorOptions { get; set; }
}
然后,在返回視圖之前(而不是設置ViewBag
),在操作中對此進行設置。 最后,您認為:
@Html.ListBoxFor(m => m.IfQualityPoor, Model.IfQualityPoorOptions, new { @class = "chosen" })
這樣簡單得多,而且這樣做絕對不會有任何問題。
更新(基於注釋)
處理將列表展平為字符串以存儲數據庫的最佳方法是為此使用一個特殊的屬性,然后自定義getter和setter映射到/來自。 例如:
public string IfQualityPoor
{
get { return IfQualityPoorList != null ? String.Join(",", IfQualityPoorList) : null; }
set { IfQualityPoorList = !String.IsNullOrWhiteSpace(value) ? value.Split(',').ToList() : null; }
}
[NotMapped]
public List<string> IfQualityPoorList { get; set; }
然后,將其發布到IfQualityPoorList
或與IfQualityPoorList
進行交互,並在保存時自動在數據庫中設置正確的字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.