3

ViewModels では、いくつかの DataAnnotations を使用してフォーム データを検証します。通常、フィールドごとに 2 ~ 3 個の注釈があります。

たとえば、電子メール アドレスのフィールドは次のようになります。

[Required(ErrorMessage = "Please enter an email address.")]
[Email(ErrorMessage = "That is not a valid email address.")] // Custom
public string Email { get; set; }

誰かがフォームを送信すると、両方のエラーが検証の概要に表示されます。Required 検証が失敗した場合に Email 検証が実行されないように、検証注釈を実行する順序を指定する簡単な方法はありますか?

これが不可能な場合、これは通常どのように処理されますか? 複数のアノテーションを持つフィールドに対してカスタムバリデータを作成する必要がありますか? 単一のアノテーションが複数のタイプの検証を処理する場合、それはアノテーションを使用する適切な方法でしょうか?

(おそらく Required アノテーションをカスタム Email アノテーションに組み合わせることができることも承知していますが、これは単なる例です)。

4

3 に答える 3

1

この特定のケースでは、ASP.NET WebForms バリデーターが取るのと同じアプローチを取るでしょう -値がまたは空の場合にEmailAttributeバリデーターを返すだけです。truenull

考えてみてください:

  • 電子メール アドレスが必要な場合は、[Required]バリデータもあり、電子メール アドレスが null または空の場合はいずれにせよ検証エラーが生成されます。

  • 電子メール アドレスがオプションの場合、null/空の値は有効と見なされます。

個々のバリデーターを一緒にうまく機能させるように設計できれば、バリデーターをインターセプトするという複雑な問題を解決する必要はありません。

于 2010-03-04T01:09:10.543 に答える
1

ここでの問題は、属性の順序が完全に恣意的であり、コンパイル時に決定されることです。使用している検証ランナーの種類に応じて、実際には単純な順序を適用できます。xVal のようなものと、ここで言及されているような検証ランナーを使用している場合、次のような orderby 句を追加して、特定の種類の属性を強制的に一番上に並べ替えることができます。

orderby attribute.GetType() == typeof(T) ? 0 : 1

クラスTから派生した、厳密に型指定された検証ランナー メソッドを作成するだけです。ValidationAttribute

于 2010-03-04T00:45:06.957 に答える
1

注文の確認: いいえ。

この場合、"" または " " は電子メール アドレスの検証に失敗するため、Required 属性を削除するだけで済みます。

はい、私の知る限り、両方を組み合わせたカスタム検証属性を作成するのがおそらく最善の策です。

于 2010-02-20T20:28:03.633 に答える