回答:
「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用です。
おそらくVisual Studioでプログラミングしているので、このような簡単なデバッグ手順でブレークポイントを使用する可能性を活用することをお勧めします(問題がどのようなものかを理解します)。それらを、ModelState.isValidをチェックする場所の直前/場所に配置し、ModelStateにカーソルを合わせます。これで、内部のすべての値を簡単に参照して、isvalidがfalseを返す原因となっているエラーを確認できます。
var asdf = ModelState.Values.Where(v => v.Errors.Count > 0);
あなたを助けることができます
bool hasErrors = ViewData.ModelState.Values.Any(x => x.Errors.Count > 1);
またはで反復する
foreach (ModelState state in ViewData.ModelState.Values.Where(x => x.Errors.Count > 0))
{
}
バインダーは、エラーメッセージなしで例外をスローすることがあります。次のスニペットを使用して例外を取得し、何が問題かを確認できます。
(バインダーが文字列を複合型に変換しようとしている場合など)
if (!ModelState.IsValid)
{
var errors = ModelState.SelectMany(x => x.Value.Errors.Select(z => z.Exception));
// Breakpoint, Log or examine the list with Exceptions.
}
コントローラのModelStateプロパティは、実際にはModelStateDictionaryオブジェクトです。辞書のキーを反復処理し、IsValidFieldメソッドを使用して、その特定のフィールドが有効かどうかを確認できます。