2014-10-09 3 views
0

Я использую 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; 
    } 
} 

Конечно, не только сообщению проверки, мне нужно глобализация имя дисплея поля тоже.

ответ

0

DataAnnotation уже обеспечивает поддержку глобализации:

[Display(ResourceType = typeof(Resource), Name = "Test")] 
[Required(ErrorMessageResourceType = typeof(Resource), ErrorMessageResourceName = "TestRequired")] 
public string Test { get; set; } 

Чтобы изменить текущую культуру в global.asax

private void Application_AcquireRequestState(object sender, EventArgs e) 
{ 
    if (Context != null && Context.Session != null) 
    { 
     string language = Context.Session["language"] as string; 
     if (language != null) 
     { 
      Thread.CurrentThread.CurrentCulture = new CultureInfo(language); 
      Thread.CurrentThread.CurrentUICulture = new CultureInfo(language); 
     } 
    } 
} 
+0

проблема заключается в том, что это выглядит, как не основанные на сессии, она основана на браузере. но я не хочу использовать браузер. Мне нужно основать 'session [" language "]' значение. – qakmak

+0

В этом случае вы можете изменить текущую культуру на основе 'session [" language "]' в Global.asax, чтобы ваш код использовал правильную культуру для доступа к ресурсам. – meziantou

+0

Извините, есть ли немного демо? Я все еще не очень четко понимаю. Если вы можете дать образец, который будет очень полезен. – qakmak

Смежные вопросы