4

私の質問の背景:

オブジェクトのプロパティを一度に 1 ページずつ入力する ASP.Net MVC 4 のウィザード スタイル インターフェイスを構築しています。DataAnnotation 属性を使用してビジネス ルールを指定し、入力済みの有効なオブジェクトがどのように見えるかを定義します。

このことから生じる複雑な問題の 1 つは、検証です。オブジェクトを完全に入力して有効にするにはいくつかの手順が必要なため、各手順で設定された各フィールドを手動で検証する必要があります。

これは、コントローラークラスで次のようになります。

[HttpPost]
public ActionResult Step1(MyBigModel m)
{
    if (ViewData.ModelState["Field1"].Errors.Count() == 0
        && ViewData.ModelState["Field2"].Errors.Count() == 0)
    {
        repository.saveStep1(m);
        return RedirectToAction("Step2", new { myId= m.myId});
    }
    else
        return View(m);
    }
}

このアプローチの厄介な点は、チェックしたいフィールドが常に ModelState ディクショナリにあるとは限らないことです! 検証エラーが発生した場合、フィールドはディクショナリに登録されます。ただし、有効な場合でも、辞書にある場合とない場合があります。

一部の入力タイプは他のタイプよりもうまく機能しているようです。テキストボックスはかなり一貫しているように見えますが、チェックボックスはまったく表示されません。彼らがいつそこにいるのかを予測するための一貫したルールセットを見つけることができず、関連するドキュメントも見つけられませんでした.

ですから、私の質問は、フィールドが ViewData.ModelState Dictionary に含まれるかどうかを決定するものは何ですか?

4

1 に答える 1

4

ModelStateDictionaryの MSDN 記事には、

投稿されたフォームを検証情報を含むアクション メソッドにバインドしようとする試みの状態を表します。

したがって、ViewData.ModelStateディクショナリには、サーバーへの要求に含まれる値が含まれます。これは、バインドされたモデルのすべてのプロパティであるとは限りません。必要なものがこのディクショナリにない場合は、ビューに隠しフィールドとして含めて、サーバーに投稿されるようにします。

于 2013-04-11T17:15:56.637 に答える