我希望能够以编程方式覆盖属性的显示名称。
我有一个定义了显示名称的视图模型。
[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);
}
我是否直接访问该属性并尝试访问其中一个属性(显示名称),还是有另一种更简单的方法可以执行此操作?
由于
答案 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
。