場合によっては、MVC アセンブリ内のどこかでエラーがスローされ、適切に処理されず、モデルの状態に期待どおりにコピーされないことがあります。次に、ビューに を表示しようとするとHtml.ValidationSummary
、エラーが表示されず、非常に混乱する可能性があります。ここに書いたこのモデル バインディング プロセスをクラッシュさせる可能性のある例の 1 つです。通常、これが起こっている理由を理解したら、コードを修正して、もう心配する必要はありません。
デバッグ中に検査するために使用する次のコードがあり、ブレークポイントでカーソルを合わせて、実際に何が起こっているかを確認できます。
public static IDictionary<string, string> GetModelStateErrors(this ViewDataDictionary viewDataDictionary)
{
Dictionary<string, string> dict = new Dictionary<string, string>();
foreach (var modelStateKey in viewDataDictionary.ModelState.Keys)
{
var modelStateValue = viewDataDictionary.ModelState[modelStateKey];
foreach (var error in modelStateValue.Errors)
{
var errorMessage = error.ErrorMessage;
var exception = error.Exception;
if (!String.IsNullOrEmpty(errorMessage))
{
dict.Add(modelStateKey, "Egads! A Model Error Message! " + errorMessage);
}
if (exception != null)
{
dict.Add(modelStateKey, "Egads! A Model Error Exception! " + exception.ToString());
}
}
}
return dict;
}
次に、UpdateModel を試行した後にこれを挿入し、ブレークポイントを設定します。
var x = ViewData.GetModelStateErrors();
への呼び出しの直後にこれを置きますUpdateModel
。にカーソルを合わせるx
と、モデル バインディング プロセスで未処理の例外が表示されます。これが実際の問題である場合。
幸運を!