ASP.NET MVC 3プロジェクトでデータ注釈を使用して、モデルを検証します。これらは非常に便利ですが、現在は私にとって魔法です。データアノテーションがnot例外をスローすることを読みました。次に、MVCはモデル状態ディクショナリに検証エラーを追加することをどのようにして知るのでしょうか。例外がスローされない場合、モデル検証がMVCまでバブルするため、モデルにプロパティを設定できませんでした。プロパティが失敗するたびに例外がスローされ、MVCモデルバインディングが例外をキャッチしてモデル状態ディクショナリに追加すると想定していました。
これをテストするために、コンソールアプリケーションを作成し、それに検証注釈を付けたサンプルクラスを追加しました。
public class MyObject
{
[StringLength(10, MinimumLength=3)]
public string Name { get; set; }
}
次に、オブジェクトをインスタンス化して、3未満の値をNameプロパティに割り当てようとしました。3未満の文字列長を示す注釈は許可されていませんが、プロパティはうまく割り当てられました。
static void Main(string[] args)
{
MyObject mine = new MyObject();
mine.Name = "hi";
Console.WriteLine(mine.Name);
Console.ReadLine();
}
この小さなプログラムは、コンソールに「hi」を書き込みます。どうして? mine.Name
を "hi"に設定しようとすると、怒るだろうと思っていました。
何が欠けていますか?
前もって感謝します。
プロパティを検証するために何も呼び出さないでください。検証はそれ自体で魔法のように行われるわけではありません。から http://msdn.Microsoft.com/en-us/library/dd901590%28v=vs.95%29.aspx
手動で値を検証する
DataGridコントロールを使用してデータを編集するためのインターフェイスを提供しない場合、検証属性は自動的に適用されません。ただし、
Validator
クラスを使用して、検証テストを手動で適用できます。プロパティのsetアクセサーでValidateProperty
メソッドを呼び出して、プロパティの検証属性に対して値をチェックできます。検証属性から検証例外を受け取るためにデータバインディングを行う場合は、bothValidatesOnExceptions
およびNotifyOnValidationError
プロパティもtrueに設定する必要があります。検証を手動で適用する例については、以下のデータバインディングの例を参照してください。
次に、MVCはモデル状態ディクショナリに検証エラーを追加することをどのようにして知るのでしょうか。
ModelValidatorProvider 、より具体的には、 DataAnnotationsModelValidatorProvider 。これはMVCによって呼び出されます。
C#には、属性と呼ばれる宣言タグを定義するためのメカニズムが用意されています。これをソースコードの特定のエンティティに配置して、追加情報を指定できます。属性に含まれる情報は、リフレクションを通じて実行時に取得できます。
https://msdn.Microsoft.com/en-us/library/aa288059(v = vs.71).aspx
属性がどのように機能するかについての知識を深めるのに役立つ3つの記事を次に示します。最後の方法は、それらの使用方法を理解している場合は最も重要ではありません。この記事はSilverlight向けですが、現在のトピックにも適用できます。
モデルが有効であるかどうかをチェックしていないため...データ表記はモデルの有効性をチェックします。その後、エラーが発生します。