カスタムリソースプロバイダーを使用して、データベースからリソース文字列を取得します。これは、リソースタイプを文字列として定義できる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クラスは封印されています。検証属性の場合、対応するクラスは存在しません。
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
はローカライズされたテキストを自動的に表示します。
私が思いついた最もクリーンな方法は、DataAnnotationsModelMetadataProvider
をオーバーライドすることです。これを行う方法についての非常にきちんとした記事があります。
DBリソースプロバイダーでローカライズするには、DataAnnotationsプロパティをオーバーライドする必要があると思います。現在のプロパティから継承し、カスタムプロバイダーからリソースを取得するときに使用するDB接続文字列などの追加のプロパティを指定できます。