I have a Car class that I\'m trying to display in an MVC 3 view using the WebGrid helper. Below are the Car and it\'s metadata class.
Car class:
[Meta
I have created a helper method like this:
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;
}
And used it like this:
new WebGridColumn { Header = Html.GetDisplayName(t=>t.Title), ColumnName = nameof(DataModel.Title), CanSort=true }
Ugly as hell but it could work:
grid.Column(
"CarName",
ModelMetadata.FromLambdaExpression(
car => car.CarName,
new ViewDataDictionary<Car>(new Car())
).DisplayName
)
The problem is that the WebGrid helper is entirely based on dynamic data, absolutely no strong typing and that's one of the reasons why I hate it. The WebMatrix team at Microsoft must be real fans of the C# 4.0 dynamic feature as their entire API takes only weakly typed objects :-)
MvcContrib Grid is much better.