@ Html.DisplayNameFor获取详细信息模型

Ale*_*lex 25 asp.net-mvc html-helper razor

在我的模型中,我有一个实体

public class Carrier
{
public Guid CarrierId { get; set; }
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我也有一个ViewModel

public class CarrierIndexViewModel
{
public IEnumerable<Carrier> Carriers { get; set; }
public PagingInfo PagingInfo { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我有一个强类型(CarrierIndexViewModel)索引视图,它假设使用PagingInfo显示Carrier表.

我正在尝试使用Html帮助器在我的表头中显示Carrier.Name当我使用IEnumerable作为此视图的模型时,我有 @Html.DisplayFor(model => model.Name)

如何使用我的新CarrierIndexViewModel显示Carrier.Name的标题?

Red*_*Taz 39

我发现不需要辅助方法,额外的代码或循环遍历集合.我刚刚使用了以下内容:

@Html.DisplayNameFor(model => model.Carriers.FirstOrDefault().Name)
Run Code Online (Sandbox Code Playgroud)

这仍然有效,即使它FirstOrDefault()会返回,null因为它只查找元数据,Name属性本身不被访问.

非常感谢@Kurian启发了这个答案.


Mat*_*cic 17

我有一个类似的问题,因为我不想手工输入我的列名,所以我写了一个帮手:

public static IHtmlString 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)

然后在视图中你会称之为

@Html.DisplayColumnNameFor(Model.Carriers, m => m.Name)
Run Code Online (Sandbox Code Playgroud)

请注意,您可以使用接受名称的显示属性和许多其他自定义,如资源文件等.

public class Carrier
{
  [Display(Name="Carrier ID")]
  public Guid CarrierId { get; set; }
  [Display(Name="Carrier Name")]
  public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

  • @ phreak3eb如果你想要硬核值,那就去吧.我已经使用了这种方法,因此我可以本地化[Display(Name ="Some name")]并避免硬编码.您可以在这里查看*.resx解决方案http://stackoverflow.com/a/20383378/1241400 (2认同)

Jed*_*Jed 8

您可以在View中添加@using语句以指定Carrier类型,然后您需要遍历Model的Carriers属性.

您的视图看起来像......

@model CarrierIndexViewModel
@using Carrier

@foreach(Carrier c in Model.Carriers)
{
 @Html.DisplayFor(model => c.Name)
}
Run Code Online (Sandbox Code Playgroud)