Как я могу использовать аннотации данных 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 (?????). Кто-нибудь знает, как это делается?
Спасибо заранее!
Ответы
Ответ 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 }