2014-07-21 148 views
0

我希望能夠以編程方式覆蓋屬性的顯示名稱。覆蓋視圖模型屬性名稱

我有一個視圖模型,其中顯示名稱已定義。

[Display(Name = "Reference")] 
    public string Reference { get; set; } 

我爲帶有字符串重寫參數的LabelFor()擴展創建了一個重載。

public static MvcHtmlString LabelFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> expression, string applicationVariableOverride) 
{ 
    if (applicationVariableOverride != null) 
     return new MvcHtmlString(applicationVariableOverride); 
    else 
     return System.Web.Mvc.Html.LabelExtensions.LabelFor<TModel, TValue>(htmlHelper, expression); 
} 

...調用它是這樣的:

@Html.LabelFor(x => x.Reference, "New Reference Display Name") 

這個偉大的工程的標籤,但不適用於作爲文本被設置使用這些屬性驗證消息的工作是動態的,根據什麼樣的信息正在顯示。相反,我想傳遞(或設置)此功能中的屬性的顯示名稱。

public static MvcHtmlString ValidationMessageFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, string applicationVariableOverride) 
{ 
    // set display name 

    return System.Web.Mvc.Html.ValidationExtensions.ValidationMessageFor<TModel, TProperty>(htmlHelper, expression); 
} 

難道我直接訪問屬性,並嘗試和它的屬性(顯示名稱)的訪問的一個或有另一種更簡單的方法來做到這一點?

謝謝

回答

1

您可以覆蓋整個錯誤消息。如果您只想替換部分錯誤消息(屬性顯示名稱) - 已經太晚了。此錯誤消息正在通過ValidationAttribute更早地設置爲ModelState(即視圖進入操作之前)。

// error is already in the collection 
string fullHtmlFieldName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(expression); 
ModelErrorCollection errors = htmlHelper.ViewData.ModelState[fullHtmlFieldName].Errors; 

你可以做什麼是黑客 - 與像

[Display(Name = "$myplaceholder$")] 
public string Reference { get; set; } 

一些奇怪的關鍵字,並在你的方法

var oldMessage = System.Web.Mvc.Html.ValidationExtensions.ValidationMessageFor<TModel, TProperty>(htmlHelper, expression); 
var newMessage = oldMessage.ToString().Replace("$myplaceholder$", applicationVariableOverride); 
return new MvcHtmlString(newMessage); 

但總體來說它聞起來像XY問題裝點你的財產 - 問題是,你爲什麼不想重寫DisplayNameAttribute

+0

感謝您的回覆。我想重寫該屬性,因爲這將是設置顯示名稱的邏輯/正確位置,但它不會讓我傳遞任何不是常量的東西...... – Beakie