[英]How do you access the DisplayNameFor in a nested model
您如何在嵌套模型中訪問DisplayNameFor
- 即:
public class Invoice
{
public int InvoiceId { get; set; }
public string CustomerName { get; set; }
public string Contact { get; set; }
public IList<InvoiceItem> InvoiceItems { get; set; }
}
public class InvoiceItem
{
public int InvoiceItemId { get; set; }
public int InvoiceId { get; set; }
[Display(Name = "Item Heading")]
public string Item { get; set; }
[Display(Name = "Item Description")]
public string Description { get; set; }
public virtual Invoice Invoice { get; set; }
}
我可以按如下方式循環遍歷嵌套項:
@foreach (var item in Model.InvoiceItems)
{
@Html.DisplayFor(modelItem => item.Item)
<br />
@Html.DisplayFor(modelItem => item.Description)
<br />
}
但是我如何到達: [Display(Name = "Item Heading")]
@Html.DisplayNameFor(modelItem => modelItem.Item)
我收到錯誤消息: 'inv5.Models.Invoice' does not contain a definition for 'Item' and no extension method 'Item' accepting a first argument of type 'inv5.Models.Invoice' could be found
謝謝,馬克
在這里,您正在訪問循環中的item
:
@Html.DisplayFor(modelItem => item.Item)
但在這里你不是:
@Html.DisplayNameFor(modelItem => modelItem.Item)
將后者更改為此,它應該可以工作:
@Html.DisplayNameFor(modelItem => item.Item)
modelItem
是Invoice
類型(傳遞給視圖的模型),但在循環中您要使用InvoiceItem
類型的item
(來自循環迭代器)。
附注:如果一切都沒有叫調試這樣的事情可能有很多更直接的“項目”。 清晰的命名很重要:)
編輯:如果您在循環之外訪問它,那么您需要手動深入到模型中。 像這樣的東西:
@Html.DisplayNameFor(modelItem => modelItem.InvoiceItems.First().Item)
感覺這會很危險,因為如果沒有項目, .First()
可能會拋出異常。 然而,正如評論所指出的和一些粗略的谷歌搜索似乎證實,在這種情況下, .First()
實際上並沒有在運行時執行。 這只是讓.DisplayNameFor()
反映到屬性中的一些.DisplayNameFor()
。
您可以為您的InvoiceItems
創建一個 DisplayTemplate ,比如“InvoiceItemHeader”:
@model IEnumerable<InvoiceItem>
@Html.DisplayNameFor(m => m.Item)
<br />
@Html.DisplayNameFor(m => m.Description)
模型的類型必須是IEnumerable<T>
,因為DisplayNameFor 方法具有此類型的重載版本。
然后在您的視圖中您可以顯示模板:
@Html.DisplayFor(m => m.InvoiceItems, "InvoiceItemHeader")
@foreach (var item in Model.InvoiceItems)
{
@Html.DisplayFor(modelItem => item.Item)
<br />
@Html.DisplayFor(modelItem => item.Description)
<br />
}
我沒有試過這個,但它應該工作。
@Html.DisplayNameFor(modelItem => modelItem.First().InvoiceItems().First().Item)
DisplayNameFor 擴展方法只不過是一個需要具有以下簽名的 Memberexpression 的方法: Expression<Func<TModel, TValue>> expression
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.