调用DisplayNameFor的IEnumerable重载

时间:2012-10-17 19:02:52

标签: asp.net-mvc generics razor

这适用于抓取标题( 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; }
}

2 个答案:

答案 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个参数,因为它需要知道您正在应用表达式的视图模型的哪个属性。