web-dev-qa-db-ja.com

DisplayAttributeとカスタムリソースプロバイダーを使用したASP.NETMVC3のローカリゼーション

カスタムリソースプロバイダーを使用して、データベースからリソース文字列を取得します。これは、リソースタイプを文字列として定義できるASP.NETで正常に機能します。 MVC 3のモデルプロパティのメタデータ属性([範囲]、[表示]、[必須]など]には、パラメーターとしてリソースのタイプが必要です。ここで、ResourceTypeは、.resxファイルの生成されたコードビハインドクラスのタイプです。 。

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

私は.resxファイルを持っていないので、そのようなクラスは存在しません。カスタムリソースプロバイダーでモデル属性を使用するにはどうすればよいですか?

私はこのようなものが欲しいです:

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

System.ComponentModelのDisplayNameAttributeには、この目的のためにオーバーライド可能なDisplayNameプロパティがありましたが、DisplayAttributeクラスは封印されています。検証属性の場合、対応するクラスは存在しません。

14
slfan

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を設定する必要があります。詳細 ここ

これを使用して、モデルを新しい属性で装飾し、値を取得するリソースのキーを次のように渡します。

[LocalizedDisplayName("Title")]

そうして Html.LabelForはローカライズされたテキストを自動的に表示します。

4
pollirrata

私が思いついた最もクリーンな方法は、DataAnnotationsModelMetadataProviderをオーバーライドすることです。これを行う方法についての非常にきちんとした記事があります。

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

7
Marcin Rybacki

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

2
danludwig