2013-08-22 77 views
0

我有一些幫助方法的集合,它們確實幫助我構建了一些我需要的視圖。所有這些都非常簡單而有效(儘管可能沒有以最佳方式實現)。我在上僅僅實現這一個方法(「RenderTitleCell」)的麻煩,應該從視圖模型的財產之一渲染使用顯示名稱一個HTML代碼段,就像這樣:從給定模型屬性訪問顯示(名稱)的輔助方法

<th>text obtained from DisplayName annotation of a model property</th> 

的問題是,我真的不知道如何傳遞「從模型屬性的DisplayName註釋中獲取的文本」,因爲(因爲它聲明)它是從模型類的顯示(名稱)註釋中獲取的屬性。 Html.DisplayNameFor做類似的事情接收linq表達式,但我真的不知道如何在我的幫助器方法上實現這種東西。

到目前爲止,我的方法剛剛接收到字符串輸出在< th>,但這真的沒有什麼幫助,因爲我不知道如何從視圖中獲取顯示名稱,以及我必須使用從類的註釋中分離出來的字符串。

任何想法?

回答

4

您可以從屬性的元數據中檢索它。

實施例:

public static IHtmlString MyHelperFor<TModel, TValue>(
    this HtmlHelper<TModel> html, 
    Expression<Func<TModel, TValue>> expression 
) 
{ 
    var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData); 
    string name = metadata.DisplayName; 

    return new HtmlString(string.Format("<th>{0}</th>", html.Encode(name))); 
} 

然後:

@model MyViewModel 
... 
@Html.MyHelperFor(x => x.SomeProperty) 

假設SomeProperty您的視圖模型裝飾有[Display][DisplayName]屬性:

[DisplayName("foo bar")] 
public string SomeProperty { get; set; } 

或:

[Display(Name = "foo bar")] 
public string SomeProperty { get; set; } 

自定義助手將產生:

<th>foo bar</th> 
+0

猜測,我的問題很大一部分是用在App_Code文件夾一個文件CSHTML與@helper方法sintax。這確實縮小了我的可能性。無論如何,你的建議似乎是完美的...將執行一個常規的幫助類,並擺脫我目前使用的這種格式。很多。 –