覆盖视图模型属性名称

时间:2014-07-21 12:08:44

标签: c# asp.net-mvc

我希望能够以编程方式覆盖属性的显示名称。

我有一个定义了显示名称的视图模型。

    [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 个答案:

答案 0 :(得分: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