.NET MVC: Локализация RequiredAttribute (без файлов ресурсов) - PullRequest
2 голосов
/ 24 марта 2011

Это проблема, с которой мы сталкиваемся в .NET MVC 2.

Мы пытаемся использовать DataAnnotations, чтобы заботиться о проверке модели для нас, как и положено.Единственная проблема, с которой мы сталкиваемся, заключается в том, что нам не нужны стандартные сообщения об ошибках (поскольку на нашем веб-сайте несколько языков).

Мы хотим локализовать это, но способ настройки сайта:является то, что весь текст приходит из базы данных.Поэтому мы хотели бы, чтобы наши сообщения об ошибках также были в базе данных.

Поэтому мы написали собственный атрибут RequiredAttribute, например:

public class LocalizedRequiredAttribute : RequiredAttribute
{   
    public string LocalizedErrorMessage
    {
        get
        {
            return ErrorMessage;
        }
        set
        {
            ErrorMessage = value.Translate();
        }
    }

}

Мы написали расширение для класса Stringдобавьте метод Translate (), который выполняет необходимый поиск в базе данных для правильной локализованной версии.

Мы используем наш атрибут следующим образом:

[LocalizedRequired(LocalizedErrorMessage = "Naam is required")]
public string Name {get; set; }

Это работает, но только один раз.

Если вы сначала посетите сайт на французском языке, вы увидите французское сообщение об ошибке, в котором говорится, что вы должны ввести значение.Если вы посетите сайт на английском языке позже, вы все равно увидите ошибку на французском языке на странице на английском языке.Кажется, что Setter вызывается только один раз.

Что мы можем сделать, чтобы предотвратить это поведение и обновлять сообщение об ошибке каждый раз, когда выполняется проверка / модель заполняется значениями?

Спасибо залюбая помощь, которую вы можете оказать мне.

Ответы [ 2 ]

3 голосов
/ 18 июля 2012

Просто используйте метод FormatErrorMessage() (он вызывается каждый раз), чтобы установить ErrorMessage свойство

Но оно хакерское

public class ErrorLocalizedRequiredAttribute : RequiredAttribute
{
    public ErrorLocalizedRequiredAttribute(string name)
    {
        Name = name;
    }

    public string Name
    { get; set; }

    public override string FormatErrorMessage(string name)
    {
        //get translation from DB by Name
        ErrorMessage = Localization.Translate(Name);
        return base.FormatErrorMessage(name);
    }
}
.
.
.
[ErrorLocalizedRequiredAttribute("EmailIsRequired")]
public string Email
{
    get; set;
}
2 голосов
/ 24 марта 2011

Не могли бы вы исправить это, переместив ваш .Translate () из вашего сеттера в ваш геттер? Имеет смысл, что ваш сеттер вызывается только один раз.

Edit: Я предположил, что ErrorMessage было виртуальным сообщением, а это не так.

Единственным вариантом может быть создание класса Resource (вам не нужен файл ресурсов), который извлекает ваши значения из базы данных.

[Required(ErrorMesageResourceName="FirstName", ErrorMessageResourceType=typeof(ABCResourceClass))]  
public string Name {get; set; } 

class ABCResourceClass{
  public static String  FirstName{
    get{
        return Translate("FirstName");
    }
  }

}

Как видно из примера, среда аннотаций вызывает свойство с именем, совпадающим со строкой, которую вы передаете ErrorMessageResourceName.

Вы можете прибегнуть к некоторой технике генерации кода для создания класса ABCResourceClass, если у вас много свойств.

...