2017-08-25 142 views
0

我已经创建了一个自定义的ASP.NET MVC ValidationAttribute,并且试图通过将一个字符串传递给基础构造函数来在实例化时为其设置自己的默认错误消息:为自定义ASP.NET MVC验证属性设置默认的ErrorMessage

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)这个base(_defaultErrorMessage)没有设置ErrorMessage属性,我应该如何设置它,同时仍然给这个属性的用户覆盖它的能力?

编辑 - 2,清洁例子:

[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。这让我对所有这些属性和构造函数之间的使用和交互感到困惑。

+0

它应该是'返回的String.Format(ErrorMessageString,名);' –

+0

不,我娃nt在那里显示_description。我应该把'name'放在默认的消息中。但它是'ErrorMessage',它是null。 – xr280xr

+0

这正是将要做的事!试试吧 –

回答

0

所以我看着源代码,我明白了为什么它很混乱。 ValidationAttribute类维护一个私有的_defaultErrorMessage字段。当我调用base(errorMessage)时,它会将我的字符串作为lambda转发给构造函数,该构造函数接受Func<string> errorMessageAccessor并将其设置为专用的_errorMessageResourceAccessor字段。该ErrorMessageString吸气首先调用名为SetupResourceAccessor方法,其中它确定是否使用

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

所以试图总结一下,调用ErrorMessage会给你明确设置的错误信息或默认的错误信息(我实际上不知道它在哪里设置,也许是通过继承类?)。调用ErrorMessageString会给你在什么看起来是presedence顺序如下消息:如果没有其他设置

  • 默认的错误消息
  • 构造的errorMessage字符串
  • 从ErrorMessageResourceName
  • 本地化的值,如果它和ErrorMessageResourceType是设置
  • 将明确设置的ErrorMessage
相关问题