14

Я использую собственный поставщик ресурсов для получения строк ресурсов из базы данных. Это отлично работает с ASP.NET, где я могу определить тип ресурса как строку. Атрибуты метаданных для свойств модели в MVC 3 (например, [Range], [Display], [Required]) требуют типа ресурса в качестве параметра, где ResourceType - это тип сгенерированного класса кода .resx-файла .Локализация ASP.NET MVC 3 с помощью DisplayAttribute и поставщика настраиваемых ресурсов

[Display(Name = "Phone", ResourceType = typeof(MyResources))] 
    public string Phone { get; set; } 

Потому что у меня нет .resx файлов, такой класс не существует. Как я могу использовать модель атрибутов с поставщиком пользовательских ресурсов?

Я хотел бы иметь что-то вроде этого :

[Display(Name = "Telefon", ResourceTypeName = "MyResources")] 
    public string Phone { get; set; } 

DisplayNameAttribute from System.ComponentModel для этой цели было переопределяемое свойство DisplayName, но класс DisplayAttribute запечатан. Для атрибутов проверки не существует соответствующих классов.

ответ

4

Вы можете расширить DisplayNameAttribute и переопределить свойство DisplayName строки. У меня есть что-то вроде этого

public class LocalizedDisplayName : DisplayNameAttribute 
    { 
     private string DisplayNameKey { get; set; } 
     private string ResourceSetName { get; set; } 

     public LocalizedDisplayName(string displayNameKey) 
      : base(displayNameKey) 
     { 
      this.DisplayNameKey = displayNameKey; 
     } 


     public LocalizedDisplayName(string displayNameKey, string resourceSetName) 
      : base(displayNameKey) 
     { 
      this.DisplayNameKey = displayNameKey; 
      this.ResourceSetName = resourceSetName; 
     } 

     public override string DisplayName 
     { 
      get 
      { 
       if (string.IsNullOrEmpty(this.GlobalResourceSetName)) 
       { 
        return MyHelper.GetLocalLocalizedString(this.DisplayNameKey); 
       } 
       else 
       { 
        return MyHelper.GetGlobalLocalizedString(this.DisplayNameKey, this.ResourceSetName); 
       } 
      } 
     } 
    } 
} 

Для MyHelper, методы могут быть что-то вроде этого:

public string GetLocalLocalizedString(string key){ 
    return _resourceSet.GetString(key); 
} 

Очевидно, что вам нужно будет добавить обработку ошибок и иметь resourceReader настройки. Более подробная информация here

При этом, вы затем украсить вашу модель с новым атрибутом, передавая ключ ресурса вы хотите получить значение из, как этого

[LocalizedDisplayName("Title")] 

Тогда Html.LabelFor будет отображаться локализованным текст автоматически.

+1

i думаю, что вы забыли поставить код для «MyHelper.GetLocalLocalizedString» –

+0

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

+1

А что такое код в «MyHelper.GetLocalLocalizedString» ??? – Bellash

2

Я думаю, вам придется переопределить свойства DataAnnotations, чтобы локализовать их с поставщиком ресурсов DB. Вы можете наследовать от текущих, а затем указать дополнительные свойства, такие как строка подключения к DB, которая будет использоваться при получении ресурсов у вашего настраиваемого поставщика.

+0

К сожалению, это не работает, так как DisplayAttribute является закрытым классом. Даже если я сделаю свою собственную реализацию для атрибута, мне придется перезаписать методы расширения HTML (например, Html.LabelFor). – slfan

+0

Я провел дополнительные исследования: я мог бы получить из DisplayNameAttribute, у которого есть переопределенное свойство DisplayName. В конце я использовал шаблон T4 для создания класса Resource, потому что мне не нужно реализовывать все атрибуты аннотации данных. – slfan

7

Самый чистый способ, с которым я столкнулся, состоит в том, чтобы переопределить DataAnnotationsModelMetadataProvider. Вот очень аккуратная статья о том, как это сделать.

http://buildstarted.com/2010/09/14/creating-your-own-modelmetadataprovider-to-handle-custom-attributes/

+0

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

+0

См. Http://www.codeproject.com/Tips/514321/A-Simple-and-Effective-Way-to-L –

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