代码之家  ›  专栏  ›  技术社区  ›  Manaf Abu.Rous

在ASP.NET MVC 2中本地化错误消息(默认验证属性)

  •  4
  • Manaf Abu.Rous  · 技术社区  · 14 年前

    我在一个多语言的网站上工作,我想本地化大多数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);
        }
    }
    

    有什么想法吗?

    1 回复  |  直到 12 年前
        1
  •  3
  •   Jakub Konecki    12 年前

    我知道怎么做的。这真的很简单和直接。

    我做的是我创造了自己的习惯 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;
        }
    }
    

    现在,当涉及到使用验证器时,您将需要提供新类的完整引用,因为它将与默认的内置类冲突。 System.ComponentModel.DataAnnotations.RequiredAttribute 在我上面的例子中。

    在我的例子中,最终结果是这样的:

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

    希望这是有用的。