RenderAction应该与表格一起使用吗?

时间:2010-01-10 05:14:27

标签: asp.net-mvc renderaction post-redirect-get

我的设置:

  • 查看以下路线:/Pages/Details/2
  • 页面详细信息视图有<% Html.RenderAction("CreatePageComment", "Comments"); %>来呈现评论表单
  • 评论表单帖子Comments/CreatePageComment
  • /Comments/CreatePageComment在成功创建评论后返回RedirectToAction
  • 这一切都很好用

我的问题:

如果存在验证错误,我应该如何返回/Pages/Detail/1并在评论表单中显示错误?

  • 如果我使用RedirectToAction,似乎验证很棘手;我是否应该使用Post-Redirect-Get模式进行验证错误,而不仅仅是返回?
  • 如果我返回View(),它会让我回到显示CreateComment.aspx视图(通过验证,但只是白页上的表单),而不是调用/Pages/Details/2的{​​{1}}路径{1}}。

如果应该使用PRG模式,那么我认为我只需要学习如何在使用PRG时进行验证。如果不是 - 对我而言,返回RenderAction似乎可以更好地处理 - 然后我不知道如何让用户返回初始视图,显示表单错误,同时使用View()

这就像你在敲打头部同时揉肚子的游戏。我也不擅长那个。我是MVC的新手,所以这可能是问题所在。

1 个答案:

答案 0 :(得分: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装饰,似乎是这样做的,但是更清洁。我接下来会试试。