2015年10月8日 星期四

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

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

我想跑一個 DisplayTemplate 它的結構是
  1. @model List<string>
  2.  
  3. @foreach (var str in Model)
  4. {
  5. <span class="label label-default">@str</span>
  6. }

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

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

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

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

解決的辦法是只好把 linq 移回 Controller 進行,然後增加一個專門給供應商名稱用的 prop。
  1. // Controller
  2. public override ActionResult Detail(string xxxCode)
  3. {
  4. ...
  5. _xxxViewModel.SelectedSupplierTexts = _xxxViewModel.Suppliers
  6. .Where(supp => _xxxViewModel.SelectedSupplierCodes.Contains(supp.Value))
  7. .Select(supp => supp.Text).ToList();
  8. ...
  9. }
  10.  
  11. // View
  12. @Html.DisplayFor(model => model.SelectedSupplierTexts, "xxxTemplate")

ref: stackOverFlow

沒有留言:

張貼留言