カスタムリソースプロバイダーで使用するための標準DataAnnotation属性のオーバーロード

古いプロジェクトであるAsp.NET MVCバージョン5があり、それが何年も前のものであるとします。 自己記述のResourceProviderを使用します。これにより、データベースからリソースを取得し、UIに表示できます。 さまざまな条件(たとえば、ユーザーがサイトにアクセスした場所)に応じて、リソースは異なって表示されます。 次は、Data Annotation属性のすべての厳密にコード化された文字列を確認するときです。

[Display(Name = "Username")] [Required(ErrorMessage = "Please enter the username")] [StringLength(64, ErrorMessage = "Username cannot exceed 64 characters")] public string Username{ get; set; }
      
      





ResourceProviderを使用して値を取得することもできます。 これを行う方法は、Asp.NET MVCで利用可能な継承とカスタマイズを少し使用して、猫の下に示します。



現在の状況で表示する必要のあるリソースを正確に見つけるために必要なすべてのロジックは、 ResourceProviderクラスとそれに関連付けられたクラスにカプセル化されているため、次のメソッドを呼び出すだけです。

 string resource = ResourceProvider.GetResource(name);
      
      







表示属性



.NET Framework 4で導入されたDisplayAttributeは 、その前身であるDisplayNameAttributeとは異なり、 封印されているとマークされているため、この場合は継承マジックを使用できません。 ここでは、 DisplayNameが System.Web.Mvc.ModelMetadataクラスでも利用できるという事実を利用しています。 DataAnnotationsModelMetadataProviderを継承するクラスを作成し、 CreateMetadataメソッドをオーバーライドしてDisplayNameResourceProviderから受け取ったクラスに置き換えます 。 NinjectをIoCコンテナーとして使用します。 リソース名を設定するには、独自のDisplayResourceAwareAttribute属性を作成します。

 public class DisplayResourceAwareAttribute : Attribute { public string ResourceName { get; set; } public DisplayResourceAwareAttribute() { } } public class ResourceAwareMetadataProvider : DataAnnotationsModelMetadataProvider { [Inject] public ResourceProvider ResourceProvider { get; set; } protected override ModelMetadata CreateMetadata( IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName) { var modelMetadata = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName); var displayNameAttr = attributes.SingleOrDefault(a => typeof(DisplayResourceAwareAttribute) == a.GetType()) as DisplayResourceAwareAttribute; if (displayNameAttr != null) { modelMetadata.DisplayName = ResourceProvider.GetResource(displayNameAttr.ResourceName); } return modelMetadata; } }
      
      





上記のコードは、属性の中からDisplayResourceAwareAttributeタイプの属性を検索し、存在する場合は、ResourceProvider.GetResourceを使用して取得した値でDisplayNameプロパティを更新します。 ここで、標準の代わりに新しいMetadataProviderを使用する必要があります。 これを行うには、Global.asax.csファイルのApplication_Startメソッドで、次の行を追加します。

 protected void Application_Start() { ... ModelMetadataProviders.Current = DependencyResolver.Current.GetService<ResourceAwareMetadataProvider>(); ... }
      
      





これで、モデルでは、標準属性を次のものに置き換えることにより、明示的に定義されたフィールドの説明を取り除くことができます。

 [DisplayResourceAware(ResourceName = "UsernameResource")] [Required(ErrorMessage = "Please enter the username")] [StringLength(64, ErrorMessage = "Username cannot exceed 64 characters")] public string Username{ get; set; }
      
      





ビューに追加の変更はなく、コントローラーが必要です。



検証属性



RequiredStringLengthなどの検証属性を使用 属性を属性から継承し、 ErrorMessageプロパティをコンストラクターで必要な値に設定できるため、簡単です。



All Articles