渲染动作返回View();形成问题

时间:2010-01-07 17:19:26

标签: asp.net-mvc renderaction

我是MVC的新手,所以请耐心等待。 : - )

我有一个强烈打字的“故事”视图。这个视图(故事)可以有评论。

我为我的评论控制器“ListStoryComments”和“CreateStoryComment”创建了两个视图(不是局部视图),它们的名字就是他们的名字所暗示的。这些视图使用RenderAction包含在故事视图中,例如:

<!-- List comments -->
<h2>All Comments</h2>
<% Html.RenderAction("ListStoryComments", "Comments", new { id = Model.Story.Id }); %>

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

(我传入Story id以列出相关评论)。

所有工作正如我所希望的那样,除非当我使用表单发布新评论时,它返回当前(父)视图,但是评论表单字段仍然显示我输入的最后一个内容而且ListStoryComments视图不是'更新以显示新故事。

基本上,页面是从缓存加载的,就像我按下浏览器的后退按钮一样。如果我按f5,它会尝试重新发布表格。如果我手动重新加载页面(在浏览器的地址栏中重新输入URL),然后按f5,我将看到我的新内容和空表单字段,这是我想要的结果。

为了完整性,我的CreateStoryComment操作如下所示:

    [HttpPost]
    public ActionResult CreateStoryComment([Bind(Exclude = "Id, Timestamp, ByUserId, ForUserId")]Comment commentToCreate)
    {
        try
        {
            commentToCreate.ByUserId = userGuid;
            commentToCreate.ForUserId = userGuid;
            commentToCreate.StoryId = 2; // hard-coded for testing

            _repository.CreateComment(commentToCreate);
            return View();
        }
        catch
        {
            return View();
        }
    }

4 个答案:

答案 0 :(得分:3)

答案是使用return RedirectToAction()。使用它可以强制执行PRG模式并实现我的目标。

我之前对原帖的评论确实导致错误,我想我仍然感到困惑,但是这样做有效:

return RedirectToAction("Details", "Steps", new { id = "2" });

答案 1 :(得分:1)

我,这是一个个人意见,认为你以错误的方式解决了这个问题。

就我个人而言;

  1. 创建一个名为ListStories的视图。
  2. 创建一个列出的部分视图 故事。
  3. 创建部分视图以创建 故事。
  4. 当您想要添加故事时,简单地说 显示添加故事html。
  5. 然后当用户按下按钮时 你做一个jQuery回发,添加 新故事并返回PartialView 无论是新故事还是全部故事 故事。
  6. 如果您返回所有的部分视图 故事然后取代边界 包含所有故事的div 新数据。
  7. 如果只返回一个故事 然后将它附加到div的末尾 包含故事。
  8. 我知道这意味着需要进行大量的重复工作,这听起来很复杂并且需要做很多工作,但这样做会意味着以后会有更大的灵活性,因为您可以重复使用部分视图,或者您可以进行一次更改现在更新了使用该部分视图的所有视图。

    另外,使用jQuery意味着添加故事看起来似乎没有任何明显的帖子,这很好。

答案 2 :(得分:0)

由于问题似乎是缓存,您可以简单地禁用/限制缓存。

将以下属性添加到您的操作中:

[OutputCache(Duration = 0, VaryByParam = "none")]

这将告诉浏览器缓存页面,但是持续0秒。当帖子重新加载页面时,您应该看到所需的结果。

答案 3 :(得分:0)

答案是确保正确设置表单操作。如果您使用了渲染并且未手动设置表单控制器和操作,则操作将是当前URL。

尝试:

<% using (Html.BeginForm("ActionName", "ControllerName")) {%>

而不是:

<% using (Html.BeginForm()) {%>