簡體   English   中英

如何在嵌套模型中訪問 DisplayNameFor

[英]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)

modelItemInvoice類型(傳遞給視圖的模型),但在循環中您要使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM