7

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>

问号应该写什么?

4

3 回答 3

10

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>

即使集合不包含任何项目,它也会起作用。

旁注:在某些情况下,您最初可能会遇到剃刀错误,但您可以忽略它。运行应用程序后,该错误将消失。

于 2016-08-19T02:43:43.180 回答
3

你可以这样做:

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

于 2016-08-19T02:13:39.930 回答
1

如果您将模型更改为IList<Item>orItem[]您可以执行以下操作:

   @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>
于 2016-08-19T02:14:27.837 回答