【问题标题】:Localizing Error Messages In ASP.NET MVC 2 (Default Validation Attributes)在 ASP.NET MVC 2 中本地化错误消息(默认验证属性)
【发布时间】:2010-08-22 10:28:41
【问题描述】:

我正在开发一个多语言网站,我想本地化大多数 ValidationAttribute 的验证错误消息,例如 [Requried]

我知道它可以像Phil Haack 在这个article 中显示的那样完成。

[Required(ErrorMessageResourceType = typeof(Resources), 
ErrorMessageResourceName = "Required")]

但我想自定义错误消息,就像我在此处使用自定义验证属性所做的那样:

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property,
                                     AllowMultiple = false,
                                     Inherited = true)]
public sealed class ValidateminRequiredNonalphanumericCharactersAttribute
: ValidationAttribute
{

    private const string _defaultErrorMessage = // Message From Resource Here ( i will be using two variables in this message ) 
    private readonly int _minnonalphanumericCharactersCounter = Membership.Provider.MinRequiredNonAlphanumericCharacters;

    public ValidateminRequiredNonalphanumericCharactersAttribute()
        : base(_defaultErrorMessage)
    {
    }

    public override string FormatErrorMessage(string name)
    {
        return String.Format(CultureInfo.CurrentUICulture, 
            ErrorMessageString, name, _minnonalphanumericCharactersCounter);
    }

    public override bool IsValid(object value)
    {
        string valueAsString = value as string;

        if (String.IsNullOrEmpty(valueAsString))
            return false;

        int nonalphanumericCharactersCounter = 0;
        char[] password = valueAsString.ToCharArray();

        foreach (char c in password)
        {
            if (!char.IsNumber(c) && !char.IsLetter(c))
                nonalphanumericCharactersCounter++;
        }

        return (nonalphanumericCharactersCounter >= _minnonalphanumericCharactersCounter);
    }
}

有什么想法吗?

【问题讨论】:

    标签: c# asp.net-mvc validation asp.net-mvc-2 localization


    【解决方案1】:

    我知道它是如何完成的。真的很简单直接。

    我所做的是创建了自己的自定义RequiredAttribute。而不是使用内置的RequiredAttribute

    唯一的缺点是您需要自己实现该验证器的逻辑。

    我知道有些人可能会认为重新实现已经存在的东西是一种开销。 (重新发明轮子),但这样我就可以完全控制验证器逻辑和错误消息。

    如您所见,逻辑是在下面的IsValid() 方法中实现的。

    这是我创建的RequiredAttribute 类:

    [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, 
                                             AllowMultiple = true, 
                                             Inherited = true)]
    public sealed class RequiredAttribute : ValidationAttribute
    {
        private const string _defaultErrorMessage = // Error Message
        // Notice that i can include the filed name in the error message 
        // which will be provided in the FormatErrorMessage Method 
    
        public RequiredAttribute()
            : base(_defaultErrorMessage)
        {
        }
    
        public override string FormatErrorMessage(string name)
        {
            return String.Format(CultureInfo.CurrentUICulture, ErrorMessageString,
                name);
        }
    
        public override bool IsValid(object value)
        {
            if (value == null || String.IsNullOrWhiteSpace(Convert.ToString(value)))
                return false;
            else
                return true;
        }
    }
    

    现在在使用 Validator 时,您需要提供新类的完整引用,因为它将与我上面示例中内置的默认 System.ComponentModel.DataAnnotations.RequiredAttribute 类发生冲突。

    在我的情况下,这是最终结果的样子:

        [Amaly.Data.Validators.Required]
        public string Username { get; set; }
    

    希望这是有用的。

    【讨论】:

    • 在您向我指出此答案后,我复制了您的代码并将其包含在我的应用程序中,后来发现其中有一个讨厌的错误(我花了几个小时才弄清楚为什么使用我的自定义属性进行验证是奇怪。错误在 IsValid() 方法中。此方法应包含以下内容: if (value == null || String.IsNullOrWhiteSpace(value.ToString())) { return false; } return是的;
    • 请为他人着想更正它。关键是要删除 as 字符串转换导致其对各种值类型的问题。
    • @mare 感谢您修复我的错误代码,,,我想我没有这个问题,因为我只使用了原始类型的验证器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多