ASP.NET MVC。 如何使用DisplayNameFor来创建表标题和正文?
如何使用DisplayNameFor()
获取属性显示名称以构建表头。 例如:
@model IEnumerable @Html.DisplayNameFor(? => ?.prop1) @Html.DisplayNameFor(? => ?.prop2) @Html.DisplayNameFor(? => ?.prop3) @foreach (Item item in Model) { @Html.DisplayFor(i => item.prop1) @Html.DisplayFor(i => item.prop2) @Html.DisplayFor(i => item.prop3) }
我应该在问号上写什么?
DisplayNameFor()
有一个接受IEnumerable
的重载 ,所以它只需要
@Html.DisplayNameFor(m => m.prop1)
请注意,这仅适用于模型为Enumerable
(在您的情况下为@model IEnumerable
)。
但如果模型是包含IEnumerable
的原型的对象,则无法工作 。
例如,以下内容不起作用
@Html.DisplayNameFor(m => m.MyCollection.prop1)
它需要
@Html.DisplayNameFor(m => m.MyCollection.FirstOrDefault().prop1)
即使集合中不包含任何项目,它也会起作用。
附注:在某些情况下,您最初可能会收到剃刀错误,但您可以忽略它。 运行应用程序后,该错误将消失。
你可以这样做:
@model IEnumerable-
@Html.DisplayNameFor(i => i.First().prop1) @Html.DisplayNameFor(i => i.First().prop2) @Html.DisplayNameFor(i => i.First().prop3) @foreach (Item item in Model) { @Html.DisplayFor(i => item.prop1) @Html.DisplayFor(i => item.prop2) @Html.DisplayFor(i => item.prop3) }
看起来你实际上是在获得IEnumerable的第一项,但事实并非如此。
由于您传递给DisplayFor()
的参数只是一个表达式树,它根本不会执行IEnumerable的First()
方法,内部DisplayFor()
只会检查传递的类型(参数的类型)以使用reflection和构建它的显示器。
如果将模型更改为IList
或Item[]
,则可以执行以下操作:
@model IList-
@Html.DisplayNameFor(x => x[0].prop1) @Html.DisplayNameFor(x => x[0].prop2) @Html.DisplayNameFor(x => x[0].prop3) ...