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

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

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

有什么想法吗?

最佳答案

我想出了它是如何完成的。它非常简单直接。

我所做的是创建自己的自定义 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;
    }
}

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

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

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

希望这有用。

关于c# - 本地化 ASP.NET MVC 2 中的错误消息(默认验证属性),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3541107/

相关文章:

asp.net-mvc - 如何从 OnResultExecuted 中获取 ActionDescription UniqueId

javascript - 为什么 <br> 没有添加到错误消息中?

c# - 我将如何为 System.Data.Linq.Table<T> 编写扩展方法?

c# - 使用 ML.NET 的动态训练/测试类

c# - 多个相关表与 1 :1 Relations. 第一个表与自动编号

mysql - 使用 log4net 存储日志信息

java - 验证类层次结构覆盖

java - Spring Boot 验证响应 JSON

c# - 测量类型之间的关系继承距离

c# - NServiceBus 传奇数据未创建