Я использую ef6 с mvc5. Мой проект нужен несколько языков. Поэтому мне нужно создать атрибут DataAnnotations для проверки этого поля.Как создать динамический атрибут DataAnnotations для проверки на MVC5 (глобализация)?
Например: у меня есть Id свойство:
public int Id { get; set; }
Для проверки мне нужно добавить аннотации, как
[Display("User Id")]
Required(ErrorMessage = "Please input the Id")
public int Id { get; set; }
Но мне нужно использовать несколько языков, поэтому я создаю новый DataAnnotations атрибутов (https://stackoverflow.com/a/2432520/1900498):
public class LocalizedDisplayAttribute : DisplayNameAttribute
{
public LocalizedDisplayAttribute(string resourceId)
: base(GetMessageFromResource(resourceId))
{ }
private static string GetMessageFromResource(string resourceId)
{
// TODO: Return the string from the resource file
}
}
Он отлично работает, но он будет кэш результат, затем, когда сеанс изменился (я использую сеанс, сохраняя режим языка страницы веб-сайта пользователя. например, 1 означает английский, 0 означает другой язык), он все равно не меняется, это проблема для меня.
Вторая проблема: я не знаю, как переписать RequiredAttribute для того, чтобы сообщить пользователю, какое-то поле не может быть пустым.
, но я также считаю есть еще одна проблема, похоже, мне нужно переписать сообщение о числовом поле ...... (хх поле должно быть числовым)
Так есть ли способ можно переписать проверки rule, позвольте мне решить сообщение об ошибке для Required, Range, Numeric ...... и он будет кэшировать его, но когда сеанс изменился, он будет читать снова?
Например:
// if session changed rewrite rule message for current language
if (session["language"].ToString() != LastLanguage)
{
if (session["language"].ToString() == "1")
//English
{
RequiredMessage = "the field {0} must be required";
NumericMessage = "the field {0} must be a number";
LastLanguage = 1;
} else{
// other language
RequiredMessage = "xx xx {0} xxxxxxxxx";
NumericMessage = "xx xx {0} xxxxxxxxxx";
LastLanguage = 0;
}
}
Конечно, не только сообщению проверки, мне нужно глобализация имя дисплея поля тоже.
проблема заключается в том, что это выглядит, как не основанные на сессии, она основана на браузере. но я не хочу использовать браузер. Мне нужно основать 'session [" language "]' значение. – qakmak
В этом случае вы можете изменить текущую культуру на основе 'session [" language "]' в Global.asax, чтобы ваш код использовал правильную культуру для доступа к ресурсам. – meziantou
Извините, есть ли немного демо? Я все еще не очень четко понимаю. Если вы можете дать образец, который будет очень полезен. – qakmak