1

私は今MVC3を学んでいますが、これは本当に混乱しています。

ViewModelいくつかの子 ViewModel を含む があります。各 ChildViewModel は異なる部分ビューでレンダリングされ、送信時にコントローラーで異なるアクションを実行します。すべての ChildViewModels は、データに対して何らかのカスタム検証を実行する必要があり、成功した場合は次のページに移動する必要があります。検証が失敗した場合は、単純に に戻ってParentViewエラーを表示する必要があります。

[HandleError]
public class MyController: Controller
{
    public ActionResult Index()
    {
        var viewModel = new ParentViewModel();
        return View("ParentView", viewModel);
    }

    [HttpPost]
    public ActionResult ChildViewModelB_Action(ChildViewModelB viewModel)
    {
        if (ModelState.IsValid)
        {
            return View("ChildViewModelB_Page2", viewModel);
        }
        else
        {

            // I'm having trouble returning to the ParentView and
            // simply displaying the ChildViewModel's errors, however
            // discovered that creating a new copy of the VM and displaying 
            // the ParentView again shows the existing data and any errors
            // But why??
            var vm = new ParentViewModel();
            return View("ParentView", vm);
        }
    }
}

例えば、

  • ページには 3 つのオプションが読み込まれます。
  • ユーザーはオプション B を選択し、フォームに入力します。
  • 送信時に、子 ViewModel B が検証されて失敗します。
  • ChildB がすべて入力された状態で、ページが ParentView に戻りますが、ChildB エラーも表示されるようになりました。

元のデータと同じデータでParentViewModelディスプレイの新しいコピーを作成するのはなぜですか?ParentViewParentViewModel

ParentViewまた、サーバー側の検証を行った後に戻る必要がある別の方法はありますか?

4

2 に答える 2

2

POST アクションで値を変更する場合は、モデル状態をクリアする必要があります

else
{
    ModelState.Clear();
    var vm = new ParentViewModel();
    return View("ParentView", vm);
}

その理由は、TextBoxFor などの Html ヘルパーは、値をバインドするときに最初にモデル状態を調べ、その後モデルを調べるためです。そして、modelstate には既に POST された値が含まれているため、それが使用されます => モデルは無視されます。これは仕様によるものです。

これは、あなたの場合に行うべき正しいことは、すでにモデルを空白にしてRedirect-After-Post パターンを尊重する GET アクションに単にリダイレクトすることです:

else
{
    return RedirectToAction("Index");
}
于 2012-06-13T16:51:17.713 に答える
0

ParentViewModel の新しいコピーを作成すると、元の ParentViewModel と同じデータで ParentView が表示されるのはなぜですか?

フィールドの値は、モデルからではなく、POST されたフォームから取得されるためです。それは理にかなっていますよね?送信した値とは異なる値が入力されたフォームをユーザーに表示させたくありません。

于 2012-06-13T16:43:15.817 に答える