Подтвердить что ты не робот

Как я могу использовать аннотации данных DisplayName для заголовков столбцов в WebGrid?

У меня есть класс Car, который я пытаюсь отобразить в представлении MVC 3 с помощью помощника WebGrid. Ниже приведены 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", ?????)
    ));

ЦЕЛЬ: Я хотел бы выяснить, как использовать аннотацию данных DisplayName как текст заголовка столбца в WebGrid (?????). Кто-нибудь знает, как это делается?

Спасибо заранее!

4b9b3361

Ответ 1

Ужасно, но это может сработать:

grid.Column(
    "CarName", 
    ModelMetadata.FromLambdaExpression(
        car => car.CarName, 
        new ViewDataDictionary<Car>(new Car())
    ).DisplayName
)

Проблема в том, что помощник WebGrid полностью основан на динамических данных, абсолютно никакой сильной типизации и одной из причин, почему я ненавижу его. Команда WebMatrix в Microsoft должна быть настоящими поклонниками динамической функции С# 4.0, поскольку весь их API использует только слабо типизированные объекты: -)

MvcContrib Grid намного лучше.

Ответ 2

Я создал вспомогательный метод, подобный этому:

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 }