这个问题在这里已经有了答案:
DisplayNameFor() From List<Object> in Model
(4 个回答)
4年前关闭。
这适用于抓取标题( NOT VALUES ):
@model IEnumerable<SomeModel>
...
<th>@Html.DisplayNameFor(m => m.SomeModelProperty)</th>
如果 SomeModelProperty 是:
[Display(Name = "An Excellent Header")]
SomeModelProperty { get; set; }
然后它会在标题
th
中显示“一个优秀的标题”元素。
你会认为这不会起作用,因为模型是 IEnumerable,它没有 m.SomeModelProperty,但它起作用是因为 HtmlHelper 有一个
HtmlHelper<IEnumerable<TModel>>
使得 lambda 的参数为
TModel
,不是
IEnumerable<TModel>
.由于这仅使用元数据,因此不需要集合中的项目。 (尽管
m.
上的智能感知会骗你,让你认为它是一个集合)。我不确定这个很酷的重载是什么时候添加的,但是对于 Index.cshtml 来说非常方便,并且消除了像
@Html.DisplayNameFor(m => @Model.FirstOrDefault().SomeModelProperty)
这样的时髦东西。我想避免。
http://msdn.microsoft.com/en-us/library/hh833697(v=vs.108).aspx
但是,当我的模型不是 IEnumerable 而是包含 IEnumerable 作为属性时,我无法弄清楚如何使其工作,例如:
public class SomeList
{
public List<SomeModel> SomeModels { get; set; }
public int Page { get; set; }
public DateTime CurrentAsOf { get; set; }
}
我希望对泛型类型参数进行明确,但我认为类型参数是由引擎指定的,该引擎从页面创建的 HtmlHelper 中滴下。我可以在页面中声明一个新的 HtmlHelper,或者以某种方式明确指定类型参数吗?
索引.cshtml:
@model SomeList
//No idea how to do this:
@Html.DisplayNameFor<IEnumerable<SomeModel>>(m => m.SomeModelProperty)
请您参考如下方法:
即使没有行也可以使用的另一个类似解决方法可能是:
...
@{var dummy = Model.FirstOrDefault(); }
<tr>
<th>
@Html.DisplayNameFor(model => dummy.SomeModelProperty)
</th>
...