web-dev-qa-db-ja.com

ModelState.IsValid == false、なぜですか?

ModelStateを無効にするエラーのリストはどこにありますか? ModelStateオブジェクトにerrorsプロパティが表示されませんでした。

106
Omu

「エラー0とIsValid == falseにできるか」について: https://github.com/Microsoft/referencesource/blob/master/System.Web/ModelBinding/ModelStateDictionary.cs#からのMVCソースコードL37-L41

public bool IsValid {
    get {
        return Values.All(modelState => modelState.Errors.Count == 0);
    }
}

今、それはできないように見えます。まあ、それはASP.NET MVC v1のことです。

42
queen3

おそらくVisual Studioでプログラミングしているので、このような簡単なデバッグ手順にブレークポイントを使用する可能性を活用することをお勧めします(問題がどのようなものであるかを把握する)。 ModelState.isValidを確認してModelStateの上にマウスを移動する場所にそれらを配置します。これで、内部のすべての値を簡単に参照して、isvalidがfalseを返す原因となるエラーを確認できます。

modelstate

241
bastijn
bool hasErrors =  ViewData.ModelState.Values.Any(x => x.Errors.Count > 1);

またはで繰り返す

    foreach (ModelState state in ViewData.ModelState.Values.Where(x => x.Errors.Count > 0))
    {

    }
22
Michael G

コントローラーのActionResultに以下のコードを貼り付け、この時点でデバッガーを配置します。

var errors = ModelState
    .Where(x => x.Value.Errors.Count > 0)
    .Select(x => new { x.Key, x.Value.Errors })
    .ToArray();
19
Krishna

バインダーがエラーメッセージなしで例外をスローする場合があります。次のスニペットを使用して例外を取得し、何が間違っているかを見つけることができます。

(多くの場合、バインダーが文字列を複合型などに変換しようとしている場合)

 if (!ModelState.IsValid)
            {
var errors = ModelState.SelectMany(x => x.Value.Errors.Select(z => z.Exception));

// Breakpoint, Log or examine the list with Exceptions.

  }
12
Jonas Stensved

ModelsState.IsValidのチェックを削除してエラーにすると、この行((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrorsをコピーしてVisual Studioの監視セクションに貼り付けると、エラーの内容が正確にわかります。エラーの場所を確認する時間を大幅に節約できます。

4
Tom McDonough

コントローラーのModelStateプロパティは、実際にはModelStateDictionaryオブジェクトです。辞書のキーを反復処理し、IsValidFieldメソッドを使用して、その特定のフィールドが有効かどうかを確認できます。

3
tvanfosson

ちょうど私に起こったように-これは、フォームを更新せずに必要なプロパティをモデルに追加するときにも発生する可能性があります。この場合、ValidationSummaryはエラーメッセージをリストしません。

2
AndyP9