如何在WebGrid中使用DisplayName数据注释作为列标题?

14

我有一个Car类,我想使用WebGrid助手在MVC 3视图中显示它。以下是Car及其元数据类。

Car类:

[MetadataType(typeof(CarMetadata))]
public partial class Car
{
    // car implementation
}

汽车元数据类:

public class CarMetadata
{        
    [DisplayName("Car Name")]
    [StringLength(100, ErrorMessageResourceType = typeof(ValidationText), ErrorMessageResourceName="CarNameDescriptionLength")]
    [Required]
    public string CarName { get; set; }    
}

查看内容:

@model List<Car>
...
var grid = new WebGrid(Model, canPage: true, rowsPerPage: 10);
grid.Pager(WebGridPagerModes.NextPrevious);

@grid.GetHtml(
    htmlAttributes: new { id = "grid" },
    columns: grid.Columns(
        grid.Column("CarName", ?????)
    ));

目标:我想知道如何在WebGrid中使用DisplayName数据注释作为列标题文本(如何实现?),有人知道怎么做吗?

谢谢提前!

2个回答

11

丑陋如地狱,但可能有效:

grid.Column(
    "CarName", 
    ModelMetadata.FromLambdaExpression(
        car => car.CarName, 
        new ViewDataDictionary<Car>(new Car())
    ).DisplayName
)
问题在于WebGrid辅助工具完全基于动态数据,没有任何强类型支持,这也是我讨厌它的原因之一。微软的WebMatrix团队肯定是C# 4.0动态特性的真正粉丝,因为他们的整个API只接受弱类型对象 :-) MvcContrib Grid要好得多。

谢谢您的回复。MvcContrib能够与DataAnnotations一起使用吗? - 80bower
@80bower,是的,它是强类型的,你可以很容易地实现这一点。 - Darin Dimitrov
感谢您的输入。我将研究使用MvcContrib。是的,您的解决方案有效,但确实有些丑陋。 :) - 80bower
不幸的是,MvcContrib Grid 已经很久没有维护了(最后更新于2011年)。 - Gerwald

0

我创建了一个像这样的帮助方法:

public static string GetDisplayName<TModel, TProperty>(this HtmlHelper<TModel> html, Expression<Func<TModel, TProperty>> property)
{
    return GetDisplay(property);
}

public static string GetDisplayName<TModel, TProperty>(this HtmlHelper<IEnumerable<TModel>> html, Expression<Func<TModel, TProperty>> property)
{
    return GetDisplay(property);
}

private static string GetDisplay<M,P>(Expression<Func<M,P>> property)
{
    var propertyExp = (MemberExpression)property.Body;
    var member = propertyExp.Member;
    var disp = (DisplayAttribute)member.GetCustomAttribute(typeof(DisplayAttribute));
    if (disp == null)
    {
        return member.Name;
    }
    return disp.Name;
}

然后像这样使用:

new WebGridColumn { Header = Html.GetDisplayName(t=>t.Title), ColumnName = nameof(DataModel.Title), CanSort=true }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接