使用済みのasp.net MVCは、知っているエンティティクラス上の機能の一部を追加し、あなたはバックエンドのデータ検証エンティティを実装することができ、ここでは単純な実装になっているはずです
原則:各プロパティは、反射エンティティによって取得した属性でマークされた特性を取得し、属性の値を確認するために、Validateメソッド(このメソッドカスタム)を呼び出す特性が有効です。
1、機能を確認するために、独自の基本クラスを作成します
このような継承された属性、特性を示し、Validateメソッドは抽象メソッドで、目的は、Validateメソッドの独自の定義のサブクラスを達成することです。エラーメッセージなどのエラーメッセージが表示されます。
1 [AttributeUsage(AttributeTargets.Property、AllowMultiple = 真)] 2 パブリック 抽象 クラスBaseAttribute:項目 3 { 4 パブリック 仮想 列エラー{ 得ます。セット; } 5 パブリック 抽象 ブール検証(オブジェクト値)。 6 }
2、BaseAttributeからプロパティを継承するクラスを作成します
ここでは3つのプロパティは、単純に書かれて、書き込みと同じですが、論理検証方法は同じではありません検証します。
1 /// <まとめ> 2 /// 制約属性はnullにすることはできません 3。 /// </要約> 4。 パブリック クラスRequiredAttribute:BaseAttribute 。5 { 6。 公共 オーバーライド 文字列のエラー{ 7。 GET 8。 { 9。 IF(ベース .ERROR =!ヌル) 10 { 11。 リターン ベース.ERROR; 12である } 13で 返す " 属性がヌルにすることはできません" ; 14 } 15 セット => ベース .ERROR = 値。 16 } 17 公共 オーバーライド ブール検証(オブジェクト値) 18 { 19 リターン(値==!ヌル)。 20 } 21 }
1 /// <まとめ> 2 /// ストリングの拘束長 3 /// </要約> 。4 パブリック クラスStringRangeAttribute:BaseAttribute 。5 { 6 公共 INT分{ GET、SET ;} 7。 公共の int型の最大{ GET。SET ;} 。8 公共 オーバーライド 文字列エラー{ 9 GET { 10 IF(ベース!.ERROR = NULL ) 。11 { 12 リターン ベース.ERROR。 13 } 14 リターン $ " 字符串长度范围{this.min} - {this.max} " 。 15 } 16 セット => ベース .ERROR = 値。} 17 公共 オーバーライド ブール検証(オブジェクト値) 18 { 19 リターン value.ToString()長さ> =。この .min && value.ToString()長さ<=。この.MAX。 20 } 21 }
1 /// <要約> 2 /// 约束符合正则表达式 3 /// </要約> 4つの パブリック クラスRegexAttribute:BaseAttribute 5 { 6 パブリック 文字列regexText。 7 公共 オーバーライド ブール検証(オブジェクト値) 8 { 9 VARの正規表現= 新しい正規表現(regexText)。 10 リターンregex.Match(value.ToString())成功。 11 } 12 }
図3に示すように、エンティティ・クラスを拡張する方法は、エンティティクラスのインスタンス属性が有効な値かどうかを確認するために使用され
この拡張のも過言ではない他の非エンティティクラスを汚染することができます拡張メソッドのこの方法は、実際には、ここでは拡張メソッドも問題ありません書かれていない、文言をお勧めします。
この拡張メソッドは、属性インスタンスのすべてを検証し、すべての検証メッセージ属性は、空の文字列が返されたことにより確認されるすべてが文字列として返されません。
1 パブリック 静的 文字列の検証<T>(このT T) 2 { 3 タイプtype = t.GetType()。 4 5 // 获取所有属性 6 PropertyInfo [] propertyInfosの=のtype.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)。 7 リスト< 文字列 > errorList = 新しいリスト< 文字列 > (); 8 のforeach(PropertyInfo propertyInfo でpropertyInfos) 9 { 10 もし(propertyInfo.IsDefined(typeof演算(BaseAttribute)))// この属性は、属性に定義されている場合、このステップの一例が構成されていない 。11 { 12は foreachの(BaseAttribute属性に propertyInfo.GetCustomAttributes(typeof演算(BaseAttribute))) 13である { 14 IF( !attribute.Validate(propertyInfo.GetValue(T、NULL ))) 15 { 16 errorList.Add($ " [propertyInfo.Name {}] " + attribute.error); 17 } 18であります } 19 20 } 21 } 22 リターン 列 .Join(" " 、errorList)。 23 }
4、エンティティ・クラスの定義、およびテスト(コンソールアプリケーション)。
id属性は必須の特性を追加し、name属性でStringRange正規表現特性を追加して、Student.csと仮定する。
。1人の パブリック クラス学生 2 { 3。 [必須(エラー= " IDを空にすることはできません!" )] 4。 公共の int型 ID {?GET、SET ;} 。5 [正規表現(regexText = "^ A * A $ "、エラー= " ルールプロパティ障害」)] 6。 [StringRange(=分5。 、最大= 10 )] 7。 公共の 文字列名{ GET、SET ;} 。8 }
1 静的 ボイドメイン(文字列[]引数) 2 { 3 学生学生= 新しい学生() 4 { 5 、ID =ヌル、 6 名= " ajiudsagasgasgaxb " 7 }。 8 列 errorStr = student.Validate()。 9 Console.WriteLineを(errorStr)。 10 Console.ReadKey()。 11 }
テスト結果
このコードでは、純粋削減の原則を自分の理解で、コードは多くの緩いを書かれている場合があります。