28

組み込みの検証機能を可能な限り使用したいと思います。CRUD メソッドにも同じモデルを使用したいと考えています。

ただし、標準パターンを使用してドロップダウンリストを作成できないため、手動で検証する必要があります。ポストバック メソッドでは、ドロップダウン リストを検証し、この結果を ModelState に追加して、データ注釈で行われる他のすべてのパラメーターを検証する必要がないようにしたいと考えています。これを達成することは可能ですか?

ドロップダウン リストについて誤解している可能性がありますが、私が読んだところによると、選択した値を正しく設定するために、ドロップダウン リストの Html オブジェクト名をモデルのプロパティと同じにすることはできません。この回避策でデータ注釈を使用することは可能ですか?

ありがとう。

4

5 に答える 5

73

を使用できます。addModelError

ModelState.AddModelError(key,message)

それを使用すると、ModelState が無効になるため、isValidfalse が返されます。


@Pieterの回答へのコメントを見た後に更新

isValid()結果に影響を与える要素を除外したい場合は、 をModelState.Remove(field)呼び出す前に メソッドを使用できますisValid()

于 2012-04-24T10:56:18.727 に答える
16

別のオプションはIValidatableObject、モデルを継承することです。そのメソッドを実装Validateすると、他のすべての検証をそのままにして、このメソッドに必要なコードを記述できます。注:IEnumerable<ValidationResult>エラーがなかったことを示すために空を返します。

public class Class1 : IValidatableObject
{
    public int val1 { get; set; }
    public int val2 { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        var errors = new List<ValidationResult>();
        if (val1 < 0)
        {
            errors.Add(new ValidationResult("val1 can't be negative", new List<string> { "val2" }));
        }
        if (val2 < 0)
        {
            errors.Add(new ValidationResult("val2 can't be negative", new List<string> { "val2" }));
        }
        return errors;
    }
}

編集:質問を読み直した後、これはこのケースには当てはまらないと思いますが、他の誰かに役立つ場合に備えて、ここに回答を残しています。

于 2012-04-24T11:08:37.703 に答える
5

ModelState.IsValid プロパティを手動で設定することはできませんが、IsValid が false であることを保証するメッセージを ModelState に追加することはできます。

ModelState.AddModelError();
于 2012-04-24T10:56:08.250 に答える