ASP.NETMVC。如何使用 DisplayNameFor 创建 table 标题和 body?
ASP.NET MVC. How use DisplayNameFor in order to create a table heading and body?
如何使用 DisplayNameFor()
获得 属性 显示名称来构建 table header。例如:
@model IEnumerable<Item>
<table class="table">
<thead>
<tr>
<td>@Html.DisplayNameFor(? => ?.prop1)</td>
<td>@Html.DisplayNameFor(? => ?.prop2)</td>
<td>@Html.DisplayNameFor(? => ?.prop3)</td>
</tr>
</thead>
<tbody>
@foreach (Item item in Model) {
<tr>
<td>@Html.DisplayFor(i => item.prop1)</td>
<td>@Html.DisplayFor(i => item.prop2)</td>
<td>@Html.DisplayFor(i => item.prop3)</td>
</tr>
}
</tbody>
</table>
我应该在问号中写什么?
你可以这样做:
@model IEnumerable<Item>
<table class="table">
<thead>
<tr>
<th>@Html.DisplayNameFor(i => i.First().prop1)</th>
<th>@Html.DisplayNameFor(i => i.First().prop2)</th>
<th>@Html.DisplayNameFor(i => i.First().prop3)</th>
</tr>
</thead>
<tbody>
@foreach (Item item in Model) {
<tr>
<td>@Html.DisplayFor(i => item.prop1)</td>
<td>@Html.DisplayFor(i => item.prop2)</td>
<td>@Html.DisplayFor(i => item.prop3)</td>
</tr>
}
</tbody>
</table>
看起来您实际上是在获取 IEnumerable 的第一项,但实际上不是。
由于您传递给 DisplayFor()
的参数只是一个表达式树,它根本不会执行 IEnumerable 的 First()
方法,内部 DisplayFor()
只会检查传递的type(参数的类型)以使用反射并为其构建显示。
如果您将模型更改为 IList<Item>
或 Item[]
,您可以这样做:
@model IList<Item>
<table class="table">
<thead>
<tr>
<td>@Html.DisplayNameFor(x => x[0].prop1)</td>
<td>@Html.DisplayNameFor(x => x[0].prop2)</td>
<td>@Html.DisplayNameFor(x => x[0].prop3)</td>
</tr>
</thead>
...
</table>
DisplayNameFor()
有一个 overload 接受 IEnumerable<T>
所以它只需要
<td>@Html.DisplayNameFor(m => m.prop1)</td>
请注意,这仅适用于模型为 Enumerable<T>
的情况(在您的情况下为 @model IEnumerable<Item>
)。
但如果模型是包含 IEnumerable<T>
属性的对象,则将不起作用。
比如下面的就不行了
<td>@Html.DisplayNameFor(m => m.MyCollection.prop1)</td>
而且需要
<td>@Html.DisplayNameFor(m => m.MyCollection.FirstOrDefault().prop1)</td>
即使集合中没有任何项目,它也能正常工作。
旁注:在某些情况下,您最初可能会收到剃须刀错误,但您可以忽略它。一旦你 运行 应用程序,该错误就会消失。
如何使用 DisplayNameFor()
获得 属性 显示名称来构建 table header。例如:
@model IEnumerable<Item>
<table class="table">
<thead>
<tr>
<td>@Html.DisplayNameFor(? => ?.prop1)</td>
<td>@Html.DisplayNameFor(? => ?.prop2)</td>
<td>@Html.DisplayNameFor(? => ?.prop3)</td>
</tr>
</thead>
<tbody>
@foreach (Item item in Model) {
<tr>
<td>@Html.DisplayFor(i => item.prop1)</td>
<td>@Html.DisplayFor(i => item.prop2)</td>
<td>@Html.DisplayFor(i => item.prop3)</td>
</tr>
}
</tbody>
</table>
我应该在问号中写什么?
你可以这样做:
@model IEnumerable<Item>
<table class="table">
<thead>
<tr>
<th>@Html.DisplayNameFor(i => i.First().prop1)</th>
<th>@Html.DisplayNameFor(i => i.First().prop2)</th>
<th>@Html.DisplayNameFor(i => i.First().prop3)</th>
</tr>
</thead>
<tbody>
@foreach (Item item in Model) {
<tr>
<td>@Html.DisplayFor(i => item.prop1)</td>
<td>@Html.DisplayFor(i => item.prop2)</td>
<td>@Html.DisplayFor(i => item.prop3)</td>
</tr>
}
</tbody>
</table>
看起来您实际上是在获取 IEnumerable 的第一项,但实际上不是。
由于您传递给 DisplayFor()
的参数只是一个表达式树,它根本不会执行 IEnumerable 的 First()
方法,内部 DisplayFor()
只会检查传递的type(参数的类型)以使用反射并为其构建显示。
如果您将模型更改为 IList<Item>
或 Item[]
,您可以这样做:
@model IList<Item>
<table class="table">
<thead>
<tr>
<td>@Html.DisplayNameFor(x => x[0].prop1)</td>
<td>@Html.DisplayNameFor(x => x[0].prop2)</td>
<td>@Html.DisplayNameFor(x => x[0].prop3)</td>
</tr>
</thead>
...
</table>
DisplayNameFor()
有一个 overload 接受 IEnumerable<T>
所以它只需要
<td>@Html.DisplayNameFor(m => m.prop1)</td>
请注意,这仅适用于模型为 Enumerable<T>
的情况(在您的情况下为 @model IEnumerable<Item>
)。
但如果模型是包含 IEnumerable<T>
属性的对象,则将不起作用。
比如下面的就不行了
<td>@Html.DisplayNameFor(m => m.MyCollection.prop1)</td>
而且需要
<td>@Html.DisplayNameFor(m => m.MyCollection.FirstOrDefault().prop1)</td>
即使集合中没有任何项目,它也能正常工作。
旁注:在某些情况下,您最初可能会收到剃须刀错误,但您可以忽略它。一旦你 运行 应用程序,该错误就会消失。