2016-08-19 71 views
3

如何使用DisplayNameFor()获取属性显示名称来构建表头。例如:ASP.NET MVC。如何使用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> 

我应该在问号中写什么?

+1

使用'LabelFor()'是不合适的(它会生成一个打算与表单控件关联的标签,但是您有很多)。使用'@ Html.DisplayNameFor(m => m.prop1)' –

+0

谢谢@StephenMuecke,我编辑了这个问题。 –

+0

那么你现在有什么问题? (请参阅我以前的评论中的代码) –

回答

5

DisplayNameFor()overload接受IEnumerable<T>因此它只是需要是

<td>@Html.DisplayNameFor(m => m.prop1)</td> 

请注意,这只是适用于型号为Enumerable<T>(在此情况下为@model IEnumerable<Item>)。

但是,如果模型是包含proeprty的对象,则该模型不起作用,该对象包含IEnumerable<T>

例如,以下将不起作用

<td>@Html.DisplayNameFor(m => m.MyCollection.prop1)</td> 

而且将需要

<td>@Html.DisplayNameFor(m => m.MyCollection.FirstOrDefault().prop1)</td> 

这将工作,即使集合包含任何项目。

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

+0

我其实比我的更喜欢你的答案,我不知道那个超载。如果'MyCollection'是一个IEnumerable,那么你需要使用类似'm.MyCollection.First()。prop1'的东西,不是吗?因为它不会是一个数组,所以你不能使用MyCollection [0]。是对的吗? – Alisson

+0

@Alisson,你的权利(索引者是属于“IList '的) - 已更新。 –

2

你可以这样做:

@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()只会检查所传递的类型(参数类型)使用反射和搭建一个展示为了它。

+0

如果列表为空,该怎么办? –

+1

@DanielSantos它仍然有效,因为'DisplayFor'不会尝试从表达式树的一些对象实例,它只会进行分析,以搭建一个展示它的元数据。 'i.First()。prop1'不会在那里被调用,这就是为什么没有这样使用的问题。尝试一下。 – Alisson

+1

应该是那些在,而不是​​ – Fran

1

如果更改模型的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> 
+0

如果项目列表为空,则会失败。在创建表之前更好地添加条件。 –

+2

@AnkitVijay lambda表达式不执行,只分析。 –

+0

我可能是错误的列表,但是,我觉得我们仍然可以在不需要的时候执行所有这些代码行。如果条件可以救我们呢? –