这适用于抓取标题( NOT VALUES ):
@model IEnumerable<SomeModel>
...
<th>@Html.DisplayNameFor(m => m.SomeModelProperty)</th>
如果SomeModelProperty是:
[Display(Name = "An Excellent Header")]
SomeModelProperty { get; set; }
然后它会在标题th
元素中显示“An Excellent Header”。
您会认为这不起作用,因为该模型是IEnumerable,它没有m.SomeModelProperty,但它起作用,因为HtmlHelper有一个HtmlHelper<IEnumerable<TModel>>
,使得lambda的参数为{{1 },而不是TModel
。由于这仅使用元数据,因此不需要集合中的项目。 (尽管IEnumerable<TModel>
上的intellisense会欺骗你,让你觉得它是一个集合。我不确定何时添加了这个很酷的重载,但是对于Index.cshtml来说非常方便,并且不再使用m.
等我想避免的时髦的东西。
http://msdn.microsoft.com/en-us/library/hh833697(v=vs.108).aspx
但是,当我的模型不是IEnumerable时,我无法弄清楚如何让它工作,而是包含IEnumerable作为属性,例如:
@Html.DisplayNameFor(m => @Model.FirstOrDefault().SomeModelProperty)
我希望明确使用泛型类型参数,但我认为类型参数是由从页面创建的HtmlHelper中逐渐减少的引擎指定的。我可以在页面中声明一个新的HtmlHelper,还是以某种方式明确指定类型参数?
Index.cshtml:
public class SomeList
{
public List<SomeModel> SomeModels { get; set; }
public int Page { get; set; }
public DateTime CurrentAsOf { get; set; }
}
答案 0 :(得分:41)
即使没有行,另一种类似的解决方法可能是:
...
@{var dummy = Model.FirstOrDefault(); }
<tr>
<th>
@Html.DisplayNameFor(model => dummy.SomeModelProperty)
</th>
...
答案 1 :(得分:5)
我有完全相同的问题,因为我正在使用ViewModel,所以我有一个ViewModel,其IEnumerable实际对象作为属性。
我确实遇到过这篇文章,如果你检查答案,那个人已经创建了自己的HTMLHelper来解决这个问题http://forums.asp.net/t/1783733.aspx。他的版本是:
public static MvcHtmlString DisplayColumnNameFor<TModel, TClass, TProperty>(
this HtmlHelper<TModel> helper, IEnumerable<TClass> model,
Expression<Func<TClass, TProperty>> expression)
{
var name = ExpressionHelper.GetExpressionText(expression);
name = helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name);
var metadata = ModelMetadataProviders.Current.GetMetadataForProperty(
() => Activator.CreateInstance<TClass>(), typeof(TClass), name);
return new MvcHtmlString(metadata.DisplayName);
}
你必须传递两个参数枚举和表达式而不是正常的表达式,所以你可能更喜欢@franz的答案。我无法看到无论如何都要传递2个参数,因为它需要知道您正在应用表达式的视图模型的哪个属性。