14

カスタムリソースプロバイダを使用してデータベースからリソース文字列を取得します。これはASP.NETでうまく動作し、リソースタイプを文字列として定義できます。 MVC 3のモデルプロパティのメタデータ属性([Range]、[Display]、[Required]など)は、リソースタイプをパラメータとして必要とします。ResourceTypeは、.resxファイルの生成コードビハインドクラスのタイプです。DisplayAttributeとカスタムリソースプロバイダによるASP.NET MVC 3のローカライゼーション

[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を拡張し、表示名の文字列プロパティをオーバーライドすることができます。私は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); 
       } 
      } 
     } 
    } 
} 

のようなものを持っている、方法はこのようなものになることができます。

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

明らかにエラー処理を追加し、resourceReaderが設定されている必要があります。詳細情報hereこれにより

は、あなたはその後、その後Html.LabelForがローカライズされた表示されます。この

[LocalizedDisplayName("Title")] 

のように、あなたがから値を取得したいリソースのキーを渡して、新しい属性を使用してモデルを飾ります自動的にテキストを表示します。

+1

を参照してください。あなたが "MyHelper.GetLocalLocalizedString"のコードを入れるのを忘れたと思う。 –

+0

私はこれがゾンビになっていることを知っているが、あなたはこれに対してもっとインターネットに値するだろう。 – Machinarius

+1

「MyHelper.GetLocalLocalizedString」のコードは何ですか? – Bellash

2

DataAnnotationsプロパティをオーバーライドしてDBリソースプロバイダでローカライズする必要があると思います。現在のものを継承し、カスタムプロバイダからリソースを取得するときに使用するDB接続文字列などのプロパティを指定できます。

+0

DisplayAttributeは封印されたクラスなので、残念ながらこれは機能しません。属性の独自の実装を行っても、HTML拡張メソッド(たとえばHtml.LabelFor)も上書きする必要があります。 – slfan

+0

私はさらに調査を行いました。DisplayNameAttributeには、DisplayNameというオーバーライドプロパティがあります。最後に、すべてのデータ注釈属性を実装する必要がないため、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 –

関連する問題