ASP.NET MVC.如何使用DisplayNameFor来创建表标题和正文?

Dan*_*tos 6 c# asp.net asp.net-mvc razor displayfor

如何使用属性显示名称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>
Run Code Online (Sandbox Code Playgroud)

我应该在问号上写什么?

小智 9

DisplayNameFor()有一个超载,接受IEnumerable<T>所以它只需要

<td>@Html.DisplayNameFor(m => m.prop1)</td>
Run Code Online (Sandbox Code Playgroud)

请注意,这仅适用于模型所在的位置Enumerable<T>(在您的情况下@model IEnumerable<Item>).

但如果模型是一个包含一个原型的对象,它将不起作用IEnumerable<T>.

例如,以下内容不起作用

<td>@Html.DisplayNameFor(m => m.MyCollection.prop1)</td>
Run Code Online (Sandbox Code Playgroud)

它需要

<td>@Html.DisplayNameFor(m => m.MyCollection.FirstOrDefault().prop1)</td>
Run Code Online (Sandbox Code Playgroud)

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

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