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