如何在嵌套模型中访问DisplayNameFor

Mar*_*ark 22 c# asp.net asp.net-mvc

如何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; }
}
Run Code Online (Sandbox Code Playgroud)

我可以循环遍历嵌套项,如下所示:

     @foreach (var item in Model.InvoiceItems)
     {
          @Html.DisplayFor(modelItem => item.Item)
          <br />
          @Html.DisplayFor(modelItem => item.Description)
          <br />
     }  
Run Code Online (Sandbox Code Playgroud)

但我怎么去: [Display(Name = "Item Heading")]

@Html.DisplayNameFor(modelItem => modelItem.Item)
Run Code Online (Sandbox Code Playgroud)

我收到错误: '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

谢谢,马克

Dav*_*vid 35

在这里,您将访问item循环:

@Html.DisplayFor(modelItem => item.Item)
Run Code Online (Sandbox Code Playgroud)

但在这里你不是:

@Html.DisplayNameFor(modelItem => modelItem.Item)
Run Code Online (Sandbox Code Playgroud)

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

@Html.DisplayNameFor(modelItem => item.Item)
Run Code Online (Sandbox Code Playgroud)

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

附注:调试这样的事情可能是很多,如果更直接的一切并没有所谓的"项目".明确命名很重要:)

编辑:如果您在循环外访问它,则需要手动深入查看模型.像这样的东西:

@Html.DisplayNameFor(modelItem => modelItem.InvoiceItems.First().Item)
Run Code Online (Sandbox Code Playgroud)

感觉就像这将是危险的,因为.First()如果没有项目可以抛出异常.但是,正如评论已经指出并且一些粗略的谷歌似乎证实,在这种情况下实际上.First()并没有在运行时执行.这只是一点点诡计,允许反映到该属性..DisplayNameFor()

  • @David - 这不会引发异常,因为`item.First()`不会在运行时执行,只是`Expression <Func <TModel,TValue >>`被传递给方法. (3认同)
  • @fixit:在循环上下文之外的是一个完全不同的故事。您可以尝试使用诸如“ modelItem.InvoiceItems.First()。Item”之类的方法。如果列表为空,则可能会抛出异常,具体取决于DisplayNameFor的实际工作方式。(我从没有偷看它的内部。) (2认同)