2015年10月8日 星期四

【ASP.NET MVC】Templates can be used only with field access, property access...etc

在使用 DisplayFor 時發生
範本只能配合欄位存取、屬性存取、單一維度陣列索引或單一參數自訂索引子運算式使用。

我想跑一個 DisplayTemplate 它的結構是
@model List<string>

@foreach (var str in Model)
{
    <span class="label label-default">@str</span>
}

目的是要讓 list 的每個 element 變成這樣
http://getbootstrap.com/components/#labels

我要展示的是供應商的名稱,但是目前 ViewModel 的 prop 只有兩個,一個是 MultiSelectList 另一個是 List 但 element 是 Code(id) 而不是 Name(text)。

所以我想到這樣做
@Html.DisplayFor(model => model.Suppliers
   .Where(supp => model.SelectedSupplierCodes.Contains(supp.Value))
   .Select(supp => supp.Text), "ListStringToLbl")

感覺上對,也編得過,但執行時期卻噴掉了,查了一下 DisplayFor Template 這個用法參數似乎只能是 model 原生的 prop。

解決的辦法是只好把 linq 移回 Controller 進行,然後增加一個專門給供應商名稱用的 prop。
// Controller
public override ActionResult Detail(string xxxCode)
{
    ...
    _xxxViewModel.SelectedSupplierTexts = _xxxViewModel.Suppliers
        .Where(supp => _xxxViewModel.SelectedSupplierCodes.Contains(supp.Value))
        .Select(supp => supp.Text).ToList();
    ...
}

// View
@Html.DisplayFor(model => model.SelectedSupplierTexts, "xxxTemplate")

ref: stackOverFlow

沒有留言:

張貼留言