繁体   English   中英

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

[英]ASP.NET MVC. How use DisplayNameFor in order to create a table heading and body?

如何使用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>

我应该在问号上写什么?

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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM