14

カスタム リソース プロバイダーを使用して、データベースからリソース文字列を取得しています。これは、リソース タイプを文字列として定義できる ASP.NET で問題なく動作します。MVC 3 のモデル プロパティのメタデータ属性 ([Range]、[Display]、[Required] など) には、パラメーターとしてリソースの型が必要です。ここで、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 クラスは封印されています。検証属性については、対応するクラスが存在しません。

4

3 に答える 3

7

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

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

于 2012-02-08T08:28:34.287 に答える
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明らかに、エラー処理を追加してセットアップする必要があります。詳細はこちら

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

[LocalizedDisplayName("Title")]

次に、Html.LabelForローカライズされたテキストが自動的に表示されます。

于 2013-04-10T17:44:09.867 に答える
2

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

于 2011-02-26T17:05:09.763 に答える