2011-03-09 66 views
12

我有一個Car類,我試圖使用WebGrid幫手在MVC 3視圖中顯示。下面是Car和它的元數據類。如何在WebGrid中爲列標題使用DisplayName數據標註?

車類:

[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中的列標題文本(?????)。有誰知道這是如何完成的?

在此先感謝!

回答

10

醜得要命,但它可以工作:

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

的問題是,在助手的WebGrid完全是基於動態數據,絕對沒有強類型,這就是爲什麼我不喜歡它的原因之一。微軟的WebMatrix團隊必須是C#4.0動態特性的真正粉絲,因爲他們的整個API只需要弱類型對象:-)

MvcContrib Grid要好得多。

+0

感謝您的答覆。 MvcContrib是否可以使用DataAnnotations? – 80bower 2011-03-09 19:09:29

+0

@ 80bower,是的,它是強類型,你可以很容易地實現這一點。 – 2011-03-09 19:10:18

+0

感謝您的意見。我將研究使用MvcContrib。是的,你的解決方案工作,是的,這很醜陋。 :) – 80bower 2011-03-09 19:16:14

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 } 
相關問題