我已经创建了一个自定义的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为null。为什么这个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也应该是空的。这让我对所有这些属性和构造函数之间的使用和交互感到非常困惑。
发布于 2017-08-26 08:43:59
所以我看了一下源代码,我明白了为什么它会让人困惑。ValidationAttribute类维护自己的私有_defaultErrorMessage字段。当我调用base(errorMessage)时,它将我的字符串作为lambda转发给接受Func<string> errorMessageAccessor并将其设置为私有_errorMessageResourceAccessor字段的构造函数。ErrorMessageString getter首先调用一个名为SetupResourceAccessor的方法,其中它决定是否使用
私有ErrorMessage字段支持_errorMessage属性,该字段似乎仅由ErrorMessage属性设置器设置。如果_errorMessageResourceAccessor为null (因为我在基本构造函数中将其设置为null),则此方法将决定是将_errorMessageResourceAccessor设置为默认错误消息、本地化资源消息还是ErrorMessage属性。然而,如果它不是null,它将把_errorMessageResourceAccessor 设置为它的当前值。最后,ErrorMessage属性由一个_errorMessage字段支持,该字段似乎只由ErrorMessage设置器设置。如果没有显式设置ErrorMessage,getter将返回默认错误消息。一旦调用了setter,它就会清除_errorMessageResourceAccessor。
因此,总之,调用ErrorMessage将给您显式设置错误消息或默认错误消息(实际上我不知道它是在哪里设置的)。也许是继承类?)。调用ErrorMessageString将给您提供一条消息,该消息的顺序如下所示:
https://stackoverflow.com/questions/45890251
复制相似问题