ASP.净MVC.如何使用DisplayNameFor来创建表的标题和主体

本文关键字:标题 主体 创建 MVC 何使用 DisplayNameFor ASP | 更新日期: 2023-09-27 18:03:14

如何使用DisplayNameFor()获得属性显示名称来构建表头。例如:

   @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>

问号里应该写什么?

ASP.净MVC.如何使用DisplayNameFor来创建表的标题和主体

DisplayNameFor()有一个接受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>

,即使集合不包含任何项也能工作。

旁注:在某些情况下,您最初可能会得到一个剃刀错误,但您可以忽略它。一旦你运行应用程序,这个错误就会消失。

你可以这样做:

   @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()只会检查传递的类型(参数的类型)来使用反射并为它构建一个显示

如果您将模型更改为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>