24

这适用于获取标题(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>。由于这仅使用元数据,因此不需要集合中的项目。(虽然intellisense onm.会欺骗你,让你认为它是一个集合)。我不确定何时添加了这个很酷的重载,但对于 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)
4

2 回答 2

44

即使没有行,另一个类似的解决方法可能是:

...
@{var dummy = Model.FirstOrDefault(); }
    <tr>
        <th>
            @Html.DisplayNameFor(model => dummy.SomeModelProperty)
        </th>
...
于 2012-12-08T18:10:13.497 回答
6

我有完全相同的问题,因为我使用的是 ViewModels,所以我有一个 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);
}

您必须传递两个参数枚举和表达式,而不是普通的 just 表达式,因此您可能更喜欢@franz 答案。我看不出无论如何都必须传递 2 个参数,因为它需要知道您将表达式应用到的视图模型的哪个属性。

于 2013-11-18T11:49:05.223 回答