调用DisplayNameFor的IEnumerable重载

Aar*_*nLS 24 generics asp.net-mvc razor

这适用于抓取标题(NOT VALUES):

@model IEnumerable<SomeModel>
...
<th>@Html.DisplayNameFor(m => m.SomeModelProperty)</th>
Run Code Online (Sandbox Code Playgroud)

如果SomeModelProperty是:

[Display(Name = "An Excellent Header")]
SomeModelProperty { get; set; }
Run Code Online (Sandbox Code Playgroud)

然后它会在标题th元素中显示"An Excellent Header" .

你会认为这不会起作用,因为模型是IEnumerable,它没有m.SomeModelProperty,但是它起作用,因为HtmlHelper有一个HtmlHelper<IEnumerable<TModel>>lambda的参数TModel不是IEnumerable<TModel>.由于这仅使用元数据,因此不需要集合中的项目.(虽然intellisense 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; }
}
Run Code Online (Sandbox Code Playgroud)

我希望明确使用泛型类型参数,但我认为类型参数是由从页面创建的HtmlHelper中逐渐减少的引擎指定的.我可以在页面中声明一个新的HtmlHelper,还是以某种方式明确指定类型参数?

Index.cshtml:

@model SomeList
//No idea how to do this:
@Html.DisplayNameFor<IEnumerable<SomeModel>>(m => m.SomeModelProperty)
Run Code Online (Sandbox Code Playgroud)

小智 42

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

...
@{var dummy = Model.FirstOrDefault(); }
    <tr>
        <th>
            @Html.DisplayNameFor(model => dummy.SomeModelProperty)
        </th>
...
Run Code Online (Sandbox Code Playgroud)

  • 以下方法或属性之间的调用不明确:'System.Web.Mvc.Html.DisplayNameExtensions.DisplayNameFor <CHFN.Models.CaseHealthareProviderRepresentativeElement,int>(System.Web.Mvc.HtmlHelper <System.Collections.Generic.IEnumerable <CHFN .Models.CaseHealthareProviderRepresentativeElement >>,System.Linq.Expressions.Expression <System.Func <CHFN.Models.CaseHealthareProviderRepresentativeElement,int >>)'和'System.Web.Mvc.Html.DisplayNameExtensions.DisplayNameFor <System.Collections.Generic. IEnumerable的<CHFN.Models.CaseHealthareProviderRepresentativeElement>,INT> ... (4认同)

Ala*_*ald 5

我有完全相同的问题,因为我使用的是ViewModel,所以我有一个Viewnodel,其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);
}
Run Code Online (Sandbox Code Playgroud)

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