22

您如何访问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

谢谢,马克

4

3 回答 3

36

在这里,您正在访问item循环中的:

@Html.DisplayFor(modelItem => item.Item)

但在这里你不是:

@Html.DisplayNameFor(modelItem => modelItem.Item)

将后者更改为此,它应该可以工作:

@Html.DisplayNameFor(modelItem => item.Item)

modelItem是类型Invoice(传递给视图的模型),但在您要使用item的循环中(来自循环迭代器),它是InvoiceItem.

旁注:如果不将所有内容都称为“项目”,那么调试这样的事情可能会直接。清晰的命名很重要:)

编辑:如果您在循环之外访问它,那么您需要手动深入了解模型。像这样的东西:

@Html.DisplayNameFor(modelItem => modelItem.InvoiceItems.First().Item)

感觉这会很危险,因为.First()如果没有项目会抛出异常。然而,正如评论所表明的那样,一些粗略的谷歌搜索似乎证实了,在这种情况下,实际上.First()并没有在运行时执行。这只是一些技巧,可以反映到财产中。.DisplayNameFor()

于 2013-05-22T13:22:51.850 回答
3

您可以为您创建一个 DisplayTemplate InvoiceItems,例如“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 />
 } 
于 2013-05-22T13:54:51.853 回答
1

我没有尝试过,但它应该可以工作。

@Html.DisplayNameFor(modelItem => modelItem.First().InvoiceItems().First().Item)

DisplayNameFor 扩展方法只不过是期望具有此签名的 Memberexpression 的方法:Expression<Func<TModel, TValue>> expression

于 2013-05-22T14:02:47.280 回答