当您使用属性装饰模型对象的属性Required
但未指定时ErrorMessage
,或者ResourceType/Name
您收到“需要 {0} 字段”的插值形式的验证消息,其中参数 0 是该DisplayName
属性的属性值。
我想将该默认字符串更改为其他内容,但我想保持它的通用性,即我不想为模型对象的每个属性指定ErrorMessage
或ResourceType/Name
。默认字符串存储在哪里以及如何更改它?
当您使用属性装饰模型对象的属性Required
但未指定时ErrorMessage
,或者ResourceType/Name
您收到“需要 {0} 字段”的插值形式的验证消息,其中参数 0 是该DisplayName
属性的属性值。
我想将该默认字符串更改为其他内容,但我想保持它的通用性,即我不想为模型对象的每个属性指定ErrorMessage
或ResourceType/Name
。默认字符串存储在哪里以及如何更改它?
您是否尝试过创建 RequiredAttribute 的派生类并覆盖 FormatErrorMessage 方法?这应该有效:
public class MyRequiredAttribute : System.ComponentModel.DataAnnotations.RequiredAttribute
{
public override string FormatErrorMessage(string name)
{
return base.FormatErrorMessage(string.Format("This is my error for {0}", name));
}
}
派生您自己的属性是一个公平的选择,并且可能具有最低的开始开销,但您需要返回并更改所有现有的[Required]
. 您(和您团队中的任何其他人)还需要记住使用(并教新人使用)正确的人。
另一种方法是替换ModelMetadataProviders
和ModelValidatorProviders
从资源文件中返回字符串。这避免了上述缺点。它还为替换其他属性(例如MaxLengthAttribute
)的消息和支持其他语言奠定了基础。
protected void Application_Start()
{
var stringProvider = new ResourceStringProvider(Resources.LocalizedStrings.ResourceManager);
ModelMetadataProviders.Current = new LocalizedModelMetadataProvider(stringProvider);
ModelValidatorProviders.Providers.Clear();
ModelValidatorProviders.Providers.Add(new LocalizedModelValidatorProvider(stringProvider));
}