Локализация сообщений об ошибках в ASP.NET MVC 2 (атрибуты проверки по умолчанию) - PullRequest
4 голосов
/ 22 августа 2010

Я работаю на многоязычном веб-сайте и хочу локализовать сообщения об ошибках проверки для большинства атрибутов ValidationAttribute, таких как [Requried]

Я знаю, что это можно сделать, как показал Фил Хаак в этой статье .

[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 Ответ

3 голосов
/ 22 августа 2010

Я разобрался, как это делается.это действительно просто и прямо.

Что я сделал, так это то, что создал свой собственный RequiredAttribute.вместо использования встроенного RequiredAttribute.

Единственным недостатком является то, что вам нужно будет самостоятельно реализовать логику этого валидатора.

Я знаю, что некоторые могут подумать, что это слишком сложно - заново реализовать то, что уже есть.(заново изобретая колесо), но таким образом я получу полный контроль над логикой Validator и сообщением об ошибке.

Как вы можете видеть, логика реализована в методе 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; }

Надеюсь, это было полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...