14

사용자 지정 리소스 공급자를 사용하여 데이터베이스에서 리소스 문자열을 가져옵니다. 이것은 리소스 유형을 문자열로 정의 할 수있는 ASP.NET에서 잘 작동합니다. [Range], [Display], [Required]와 같이 MVC 3의 모델 속성에 대한 메타 데이터 속성은 Resource 유형을 매개 변수로 요구합니다. 여기서 ResourceType은 .resx 파일의 생성 된 코드 숨김 클래스 유형입니다. . 내가 된 .resx 파일을 가지고 있지 않기 때문에, 이러한 클래스가 존재하지 않는DisplayAttribute 및 사용자 지정 리소스 공급자를 사용하는 ASP.NET MVC 3 현지화

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

. 내가 사용할 수있는 방법이 모델은 사용자 정의 자원 제공자와 속성?

나는 이런 식으로 뭔가를하고 싶습니다 :

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

DisplayNameAttribute from System.ComponentModel 이 목적을 위해 재정의 가능한 DisplayName 속성을 가졌지 만 DisplayAttribute 클래스는 봉인되어 있습니다. 유효성 검사 속성에는 해당 클래스가 없습니다.

답변

4

당신은 DisplayNameAttribute를 확장하고 표시 이름 문자열 속성을 재정의 할 수 있습니다.

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

은 분명히 당신이 오류 처리를 추가하고 resourceReader이 설정이 필요합니다 : 나는 MyHelper은이

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); 
       } 
      } 
     } 
    } 
} 

같은 것을 가지고, 방법은 다음과 같이 할 수 있습니다. 더 많은 정보를 원하시면 here이와

, 당신은 그 다음 Html.LabelFor가 지역화 된 표시이

[LocalizedDisplayName("Title")] 

처럼, 당신의 가치를 얻을하려는 자원의 키를 전달하는 새로운 속성과 모델을 장식 자동으로 텍스트.

+1

을 참조하십시오. "MyHelper.GetLocalLocalizedString"코드를 넣는 것을 잊어 버린 것 같아요 –

+0

나는 이것이 좀비가된다는 것을 알고 있지만 더 많은 internets이 필요합니다. – Machinarius

+1

그리고 "MyHelper.GetLocalLocalizedString"의 코드는 무엇입니까 ??? – Bellash

2

DataAnnotations 속성을 DB 리소스 공급자로 지역화하려면이 속성을 재정의해야한다고 생각합니다. 현재의 것들을 상속받을 수 있고, 커스텀 공급자로부터 리소스를 얻을 때 사용할 DB 연결 문자열과 같은 추가 속성을 지정할 수 있습니다.

+0

DisplayAttribute가 봉인 된 클래스이기 때문에 불행히도 작동하지 않습니다. 속성에 대한 고유 한 구현을 수행하더라도 HTML 확장 메서드 (예 : Html.LabelFor)를 덮어 써야합니다. – slfan

+0

추가 조사를했습니다 : DisplayNameAttribute에서 파생시킬 수 있는데, DisplayNameAttribute는 DisplayName이라는 override 가능한 속성을가집니다. 결국 나는 모든 데이터 주석 속성을 구현할 필요가 없으므로 T4 템플릿을 사용하여 Resources 클래스를 생성했습니다. – 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 –

관련 문제