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


120

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

回答:


45

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

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

今ではできないようです。まあ、それはASP.NET MVC v1用です。


それはすべきではないようですが、Values.All(modelState => modelState.Errors.Count == 0)に何か問題がありますか?
Omu

エラーはメッセージまたは例外である可能性があることに注意してください。たとえば、Html.ValidationSummaryは例外を表示しません(セキュリティ上の理由から)。多分それがエラーが表示されない理由ですか?エラーがないことをどのように確認しますか?
queen3 2009年

1
ModelState.IsValidがfalseを返す
Omu

ハハ、それは明白です...「値に0エラーがある」かどうかをどのようにチェックしますか?
queen3

258

おそらくVisual Studioでプログラミングしているので、このような簡単なデバッグ手順でブレークポイントを使用する可能性を活用することをお勧めします(問題がどのようなものかを理解します)。それらを、ModelState.isValidをチェックする場所の直前/場所に配置し、ModelStateにカーソルを合わせます。これで、内部のすべての値を簡単に参照して、isvalidがfalseを返す原因となっているエラーを確認できます。

モデル状態


3
すべての値に0エラーがあり、modelstateがまだ無効である可能性はありますか?
Omu

上記のように、これは不可能です:)。どこかにエラーカウントがあるはずです!= 0。
バスティン2009年

2
アドオンとして、ErrorMessageが不明確な場合は、キーに移動すると、それが参照している変数が表示されます。
ルミナス

1
ビューで、@ Html.HiddenFor(model => model.Username)が問題を解決します!
Umit Kaya、2015

1
var asdf = ModelState.Values.Where(v => v.Errors.Count > 0);あなたを助けることができます
Cirelli94

37

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

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

3
ここでのベストアンサーは、より高く評価されるべきです。エラーを取り除くことができるのに、デバッガーでModelStateオブジェクトの5つのレイヤーを掘り下げることに時間を費やすのはなぜですか。最高の回答
Sean T

2
これは史上最高です
おもちゃ

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

またはで反復する

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

    }

すべての値に0エラーがあり、modelstateがまだ無効である可能性はありますか?
OMU

1
modelstateには、キー「プロパティ」と、関連する辞書のエラーがあります。エラーメッセージは空白になる可能性がありますが、エラー数には無効なプロパティ数が反映されます。ModelStateDictionary.AddModelErrorメソッドがキーを受け取り、例外またはエラー文字列を受け取るためです。モデルエラーを追加する必要があります。
マイケルG

13

バインダーは、エラーメッセージなしで例外をスローすることがあります。次のスニペットを使用して例外を取得し、何が問題かを確認できます。

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

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

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

  }

1
このコードは私にとって非常に役に立ちましたが、各.Messageを取得するためにエラー(例外)を繰り返すと、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」という結果になりました。z.Exceptionをz.ErrorMessageに変更すると、エラーメッセージを表示できました。
StackOverflowUser

これは私にとっての解決策であり、z.ErrorMessageに変更しましたが、z.Exceptionでエラーは発生せず、null値のみでした。おそらく元の答えを更新する価値があります。
esp

5

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


1
本当に役立つヒント。
Ash

これは、このスレッドで最高のアドバイスです。私が持っていた問題は愚かな「」でした。(ドット)ユーザー名
mangia

3

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


3

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


1
これは私に起こりました。チップのTHX!
Lewis86
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.