为自定义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里面, ErrorMessageErrorMessageResourceTypeErrorMessageResourceName都是空的。 所以这个描述听起来像ErrorMessageString也应该为null。 这让我对所有这些属性和构造函数之间的使用和交互感到困惑。


所以我查看了源代码,并了解它为什么会令人困惑。 ValidationAttribute类维护一个私有的_defaultErrorMessage字段。 当我调用base(errorMessage)时,它会将我的字符串作为lambda转发给接受Func<string> errorMessageAccessor并将其设置为私有_errorMessageResourceAccessor字段的_errorMessageResourceAccessorErrorMessageString getter首先调用一个名为SetupResourceAccessor的方法,它在此决定是否使用

ErrorMessage属性由私人_errorMessage字段支持,该字段似乎只由ErrorMessage属性设置器设置。 如果_errorMessageResourceAccessor为空(它不在我的情况中,因为我将它设置在基础构造函数中),则此方法将决定是否将_errorMessageResourceAccessor设置为默认错误消息,本地化资源消息或ErrorMessage属性。 但是,如果它不为null,则会将_errorMessageResourceAccessor设置为其当前值。 这是我遇到的情况。 最后, ErrorMessage属性由_errorMessage字段支持,该字段似乎只能由ErrorMessage设置器设置。 如果ErrorMessage未明确设置,则getter将返回默认错误消息。 一旦setter被调用,它就会清除_errorMessageResourceAccessor

因此,为了总结,调用ErrorMessage会给你显式设置的错误信息或默认的错误信息(我实际上不知道它在哪里设置,也许是通过继承类?)。 调用ErrorMessageString会给你一个消息,看看是什么看起来如下顺序:

  • 如果没有其他设置,则默认错误消息
  • 构造函数errorMessage字符串
  • 如果设置了ErrorMessageResourceName和ErrorMessageResourceType,则从ErrorMessageResourceName获得本地化值
  • 明确设置的ErrorMessage
  • 链接地址: http://www.djcxy.com/p/56651.html

    上一篇: Setting a default ErrorMessage for a custom ASP.NET MVC ValidationAttribute

    下一篇: ASP MVC Validate time