5

私のセットアップ:

  • 次のようなルートを表示します。/Pages/Details/2
  • ページ詳細ビューは<% Html.RenderAction("CreatePageComment", "Comments"); %>コメントフォームをレンダリングする必要があります
  • コメントフォームの投稿Comments/CreatePageComment
  • /Comments/CreatePageCommentRedirectToActionコメントが正常に作成されたときに返されます
  • これはすべてうまく機能します

私の質問:

/Pages/Detail/1検証エラーが発生した場合、コメントフォームに戻ってエラーを表示するにはどうすればよいですか?

  • を使用する場合RedirectToAction、検証は難しいようです。単に返すのではなく、検証エラーにPost-Redirect-Getパターンを使用する必要がありますか?
  • 戻るView()と、CreateComment.aspxビューを表示するようになります(検証は行われますが、白いページのフォームだけです) 。/Pages/Details/2を呼び出したルートではありませんRenderAction

PRGパターンを使用する必要がある場合は、PRGを使用しながら検証を行う方法を学ぶ必要があると思います。そうでない場合、そして私にはこれを返すことでより適切に処理できるように思われますView()が、を使用しているときにユーザーを初期ビューに戻してフォームエラーを表示する方法がわかりませんRenderAction

これは、頭を軽くたたくと同時に腹をこするゲームのように感じます。私もそれが苦手でした。私はMVCを初めて使用するので、ここで問題が発生する可能性があります。

4

1 に答える 1

5

答えは、たとえば次のようにTempDataを使用することだと思います。

私の見解(/ステップ/詳細)では:

<!-- List comments -->
<% Html.RenderAction("List", "Comments", new { id = Model.Step.Id }); %>

<!-- Create new comment -->
<% Html.RenderAction("Create", "Comments", new { id = Model.Step.Id }); %>

コメントコントローラーには、POSTメソッドがあります。

    // POST: /Comments/Create
    [HttpPost]
    public ActionResult Create([Bind(Exclude = "Id, Timestamp, ByUserId, ForUserId")]Comment commentToCreate)
    {
        if (ModelState.IsValid)
        {
            //Insert functionality here

            return RedirectToAction("Details", "Steps", new { id = commentToCreate.StepId });

        }

    //If validation error
        else
        {

            //Store modelstate from tempdata
            TempData.Add("ModelState", ModelState);

            //Redirect to action (this is hardcoded for now)
            return RedirectToAction("Details", "Steps", new { id = commentToCreate.StepId });
        }
    }

コメントコントローラーには、私のGETメソッドもあります。

    //
    // GET: /Comments/Create

    public ActionResult Create(int id)
    {

        if (TempData.ContainsKey("ModelState"))
        {
            ModelStateDictionary externalModelState = (ModelStateDictionary)TempData["ModelState"];
            foreach (KeyValuePair<string, ModelState> valuePair in externalModelState)
            {
                ModelState.Add(valuePair.Key, valuePair.Value);
            }
        }
        return View(new Comment { StepId = id });
    }

これは私にとってはうまくいきますが、これが良い習慣であるかどうかなどについてのフィードバックをいただければ幸いです。

また、MvcContribには、これを行うように見えるModelStateToTempData装飾がありますが、よりクリーンな方法であることに気付きました。次にそれを試してみます。

于 2010-01-12T16:27:47.480 に答える