首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为自定义的ErrorMessage MVC ValidationAttribute设置默认ValidationAttribute

为自定义的ErrorMessage MVC ValidationAttribute设置默认ValidationAttribute
EN

Stack Overflow用户
提问于 2017-08-25 22:39:45
回答 1查看 2.1K关注 0票数 2

我已经创建了一个自定义的ASP.NET MVC ValidationAttribute,并且我试图在实例化时设置自己的默认错误消息,方法是将一个字符串传递给基本构造函数:

代码语言:javascript
复制
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属性,我应该如何设置它,同时仍然赋予该属性的用户重写它的能力?

编辑-第二版,更简洁的例子:

代码语言:javascript
复制
[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也应该是空的。这让我对所有这些属性和构造函数之间的使用和交互感到非常困惑。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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将给您提供一条消息,该消息的顺序如下所示:

  • 显式设置ErrorMessage
  • 如果设置了ErrorMessageResourceName和ErrorMessageResourceType的本地化值
  • 构造函数errorMessage字符串
  • 如果没有其他设置,则默认错误消息。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45890251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档