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
一、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]技術剖析
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: }
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 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: }