ASP.NET MVCマークアップ特性に基づくModel検証:DataAnnotationsModelValidator

10316 ワード

ASPについてNET MVCは、寸法プロパティのModel検証に基づいており、データ型とそのプロパティに適用されて検証ルールとエラーメッセージを定義するValidationAttributeしか知らない人が多い.『ASP.NET MVC ModelValidatorを核心とするModel検証体系:ModelValidator』の紹介により,最終的にModel検証に用いられるのはModelValidatorというコンポーネントであることが分かった.ValidationAttribute対応のModelValidatorはDataAnnotationsModelValidatorです.この短い文章ではASPを紹介します.NET MVCは、Validationに対してDataAnnotationsModelValidatorを作成する方法と、前者を使用してModel検証を実施する方法です.[本明細書は『How ASP.NET MVC Works?』に同期している]

一、DataAnnotationsModelValidator


ModelValidatorは、実際にModel検証に使用されるコンポーネントであり、上述した検証特性は最終的にDataAnnotationsModelValidatorオブジェクトにカプセル化され、Model検証システムに適用される.以下のコード断片に示すように、カプセル化されたValidationAttributeは、コンストラクション関数で初期化された読み取り専用属性Attributeによって表される.
   1: public class DataAnnotationsModelValidator : ModelValidator
   2: {
   3:     public DataAnnotationsModelValidator(ModelMetadata metadata, ControllerContext context, ValidationAttribute attribute);
   4:     public override IEnumerable<ModelClientValidationRule>  GetClientValidationRules();
   5:  
   6:     public override IEnumerable<ModelValidationResult> Validate(object container)
   7:     {
   8:         ValidationContext validationContext = new ValidationContext(container ?? this.Metadata.Model, null, null)
   9:         {
  10:             DisplayName = this.Metadata.GetDisplayName()
  11:         };
  12:         ValidationResult validationResult = this.Attribute.GetValidationResult(this.Metadata.Model, validationContext);
  13:         if (validationResult != ValidationResult.Success)
  14:         {
  15:             ModelValidationResult iteratorVariable2 = new ModelValidationResult
  16:             {
  17:                 Message = validationResult.ErrorMessage
  18:             };
  19:             yield return iteratorVariable2;
  20:         }
  21:         else
  22:         {
  23:             yield break;
  24:         }
  25:     }
  26:     protected ValidationAttribute Attribute { get; }
  27:     protected string ErrorMessage { get; }
  28:     public override bool IsRequired { get; }
  29: }
検証を実施するためのコアメソッドValidateの完全な定義を示した.この方法では、現在の検証コンテキストを表すValidationContextオブジェクトを、Nullの場合はModelメタデータのModelプロパティを使用する検証対象オブジェクトに基づいて作成し、そのコンテキストの表示名としてModelメタデータのDisplayNameプロパティを使用します.最後に、カプセル化されたValidationAttributeのGetValidationResultメソッドを直接呼び出して指定したオブジェクトを検証し、返されたValidationResultオブジェクトが空でない場合、ModelValidationResultオブジェクトを作成して返します.
ちなみに、DataAnnotationsModelValidatorに定義されている他の2つの保護された読み取り専用属性の論理について説明します.エラーメッセージを返すために使用されるErrorMessageプロパティは、ValidationAttributeのFormatErrorMessageメソッドの呼び出し元であり、指定されたパラメータは現在のModelメタデータのDisplayNameプロパティです.必須フィールドの検証にはRequiredAttributeのみが使用されるため、ValidationAttributeがRequiredAttributeの場合、IsRequired属性はTrueに戻ります.

二、DataAnnotationsModelValidator<tatribute>


DataAnnotationsModelValidator<TAttribute>はDataAnnotationsModelValidatorのサブクラスであり、その汎用パラメータは対応するValidationAttributeのタイプであり、以下のコード断片はその定義を反映している.
   1: public class DataAnnotationsModelValidator<TAttribute> : DataAnnotationsModelValidator where TAttribute: ValidationAttribute
   2: {    
   3:     public DataAnnotationsModelValidator(ModelMetadata metadata, ModelBindingExecutionContext context, TAttribute attribute);
   4:     protected TAttribute Attribute { get; }
   5: }
DataAnnotationsModelValidatorと対応するValidationAttributeの適合として、ASP.NET MVCは、一般的に使用されるValidationAttribute(RequiredAttribute、RangeAttribute、RegularExpressionAttribute、StringLengthAttribute)の適切な適合タイプを定義します.次のコード・セグメントに示すように、これらはすべて汎用的なDataAnnotationsModelValidatorのサブクラスです.これらのValidationAttributeをModelタイプに適用すると、実際にModel検証に使用されるのは、これらが適切なModelValidatorとして使用されることです.
   1: public class RequiredAttributeAdapter : DataAnnotationsModelValidator<RequiredAttribute>
   2: {
   3:     public RequiredAttributeAdapter(ModelMetadata metadata, ControllerContext context, RequiredAttribute attribute);
   4:     public override IEnumerable<ModelClientValidationRule> GetClientValidationRules();
   5: }
   6:  
   7: public class RangeAttributeAdapter : DataAnnotationsModelValidator<RangeAttribute>
   8: {    
   9:     public RangeAttributeAdapter(ModelMetadata metadata, ControllerContext context, RangeAttribute attribute);
  10:     public override IEnumerable<ModelClientValidationRule> GetClientValidationRules();
  11: }
  12:  
  13: public class RegularExpressionAttributeAdapter : DataAnnotationsModelValidator<RegularExpressionAttribute>
  14: {    
  15:     public RegularExpressionAttributeAdapter(ModelMetadata metadata, ControllerContext context, RegularExpressionAttribute attribute);
  16:     public override IEnumerable<ModelClientValidationRule> GetClientValidationRules();
  17: }
  18:  
  19: public class StringLengthAttributeAdapter : DataAnnotationsModelValidator<StringLengthAttribute>
  20: {    
  21:     public StringLengthAttributeAdapter(ModelMetadata metadata, ControllerContext context, StringLengthAttribute attribute);
  22:     public override IEnumerable<ModelClientValidationRule>GetClientValidationRules();
  23: }

 


ASP.NET MVCマークアップ特性に基づくModel検証:ValidationAttribute   ASP.NET MVCマークアップ特性に基づくModel検証:DataAnnotationsModelValidator   ASP.NET MVCマークアップ特性に基づくModel検証:DataAnnotationsModelValidatorProvider   ASP.NET MVC寸法特性に基づくModel検証:パラメータにValidationAttributeを適用する   ASP.NET MVCマークアップ特性に基づくModel検証:1つのModel、複数の検証ルール
作成者:
Artech
出典:
http://artech.cnblogs.com/
本文の著作権は著者とブログ園に共有され、転載を歓迎するが、著者の同意を得ずにこの声明を保留し、文章のページの明らかな位置で原文の接続を与えなければならない.そうしないと、法律責任を追及する権利を保留する.
分類:
[01]技術剖析