web-dev-qa-db-ja.com

データ注釈はどのように機能しますか?

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"に設定しようとすると、怒るだろうと思っていました。

何が欠けていますか?

前もって感謝します。

24
Chev

プロパティを検証するために何も呼び出さないでください。検証はそれ自体で魔法のように行われるわけではありません。から http://msdn.Microsoft.com/en-us/library/dd901590%28v=vs.95%29.aspx

手動で値を検証する

DataGridコントロールを使用してデータを編集するためのインターフェイスを提供しない場合、検証属性は自動的に適用されません。ただし、Validatorクラスを使用して、検証テストを手動で適用できます。プロパティのsetアクセサーでValidatePropertyメソッドを呼び出して、プロパティの検証属性に対して値をチェックできます。検証属性から検証例外を受け取るためにデータバインディングを行う場合は、both ValidatesOnExceptionsおよびNotifyOnValidationErrorプロパティもtrueに設定する必要があります。検証を手動で適用する例については、以下のデータバインディングの例を参照してください。

16
John Gardner

次に、MVCはモデル状態ディクショナリに検証エラーを追加することをどのようにして知るのでしょうか。

ModelValidatorProvider 、より具体的には、 DataAnnotationsModelValidatorProvider 。これはMVCによって呼び出されます。

3
Max Toro

C#には、属性と呼ばれる宣言タグを定義するためのメカニズムが用意されています。これをソースコードの特定のエンティティに配置して、追加情報を指定できます。属性に含まれる情報は、リフレクションを通じて実行時に取得できます。

https://msdn.Microsoft.com/en-us/library/aa288059(v = vs.71).aspx

属性がどのように機能するかについての知識を深めるのに役立つ3つの記事を次に示します。最後の方法は、それらの使用方法を理解している場合は最も重要ではありません。この記事はSilverlight向けですが、現在のトピックにも適用できます。

属性の概要

属性

DataTypeAttributes

silverlightでのデータ注釈の使用

3
BentOnCoding

モデルが有効であるかどうかをチェックしていないため...データ表記はモデルの有効性をチェックします。その後、エラーが発生します。

0
njoromwando