为自定义ASP.NET MVC ValidationAttribute设置默认的ErrorMessage
我已经创建了一个自定义的ASP.NET MVC ValidationAttribute,并且我试图通过将一个字符串传递给基础构造函数来在实例化时为其设置我自己的默认错误消息:
public class BusinessLogicRegex : ValidationAttribute, IClientValidatable
{
private const string _defaultErrorMessage = "Invalid Password. {0}";
private string _description;
//Other private members
...
public BusinessLogicRegex(string getMember, Type getMemberType, string descriptionMember, Type descriptionMemberType)
: base(_defaultErrorMessage)
{
//Omitted the guts of initializing validation for brevity
...
}
public override string FormatErrorMessage(string name)
{
return String.Format(ErrorMessage, _description);
}
}
但是,当调用FormatErrorMessage时,ErrorMessage为空。 为什么这个base(_defaultErrorMessage)
设置ErrorMessage属性,我应该如何设置它,同时仍然给这个属性的用户覆盖它的能力?
编辑 - 第二,更清晰示例:
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class TestValidator : ValidationAttribute
{
public TestValidator()
: base("Test Error on {0}")
{
}
public override string FormatErrorMessage(string name)
{
return String.Format(ErrorMessage, name);
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
}
}
在这里,FormatErrorMessage再次抛出一个空引用异常,因为ErrorMessage
为空。 但ErrorMessageString
==“在{0}上测试错误”。 所以我的错误似乎认为调用base("Test Error on {0}")
设置ErrorMessage属性。 我根本不明白这一点。 这里基础构造函数如何描述它的errorMessage
参数:
与验证控件关联的错误消息
以下是MSDN有关ErrorMessageString
属性的说法:
错误消息字符串通过评估ErrorMessage属性或通过评估ErrorMessageResourceType和ErrorMessageResourceName属性获得。 这两种情况是相互排斥的。 如果要显示本地化的错误消息,则使用第二种情况。
然而在运行时的FormatErrorMessage里面, ErrorMessage
, ErrorMessageResourceType
和ErrorMessageResourceName
都是空的。 所以这个描述听起来像ErrorMessageString
也应该为null。 这让我对所有这些属性和构造函数之间的使用和交互感到困惑。
所以我查看了源代码,并了解它为什么会令人困惑。 ValidationAttribute类维护一个私有的_defaultErrorMessage字段。 当我调用base(errorMessage)时,它会将我的字符串作为lambda转发给接受Func<string> errorMessageAccessor
并将其设置为私有_errorMessageResourceAccessor
字段的_errorMessageResourceAccessor
。 ErrorMessageString
getter首先调用一个名为SetupResourceAccessor
的方法,它在此决定是否使用
ErrorMessage
属性由私人_errorMessage
字段支持,该字段似乎只由ErrorMessage
属性设置器设置。 如果_errorMessageResourceAccessor
为空(它不在我的情况中,因为我将它设置在基础构造函数中),则此方法将决定是否将_errorMessageResourceAccessor
设置为默认错误消息,本地化资源消息或ErrorMessage
属性。 但是,如果它不为null,则会将_errorMessageResourceAccessor
设置为其当前值。 这是我遇到的情况。 最后, ErrorMessage
属性由_errorMessage字段支持,该字段似乎只能由ErrorMessage
设置器设置。 如果ErrorMessage
未明确设置,则getter将返回默认错误消息。 一旦setter被调用,它就会清除_errorMessageResourceAccessor
。
因此,为了总结,调用ErrorMessage
会给你显式设置的错误信息或默认的错误信息(我实际上不知道它在哪里设置,也许是通过继承类?)。 调用ErrorMessageString
会给你一个消息,看看是什么看起来如下顺序:
上一篇: Setting a default ErrorMessage for a custom ASP.NET MVC ValidationAttribute