1

我是 MVC 的新手,所以请多多包涵。:-)

我有一个强类型的“故事”视图。此视图(故事)可以有评论。

我为我的 Comments 控制器“ListStoryComments”和“CreateStoryComment”创建了两个视图(不是部分视图),它们的功能与它们的名称所暗示的一样。这些视图使用 RenderAction 包含在 Story View 中,例如:

<!-- 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

4 回答 4

3

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

我之前对原始帖子的评论确实导致了一个错误,我想我仍然对此感到困惑,但这有效:

return RedirectToAction("Details", "Steps", new { id = "2" });
于 2010-01-08T13:53:11.220 回答
1

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

我个人会;

  1. 创建一个名为 ListStories 的视图。
  2. 创建列出故事的局部视图。
  3. 创建局部视图以创建故事。
  4. 当您想添加故事时,只需显示添加故事 html。
  5. 然后,当用户按下按钮时,您执行 jQuery 回发,添加新故事并返回新故事或所有故事的 PartialView。
  6. 如果您返回所有故事的部分视图,则将包含所有故事的边界 div 替换为新数据。
  7. 如果您只返回一个故事,则将其附加到包含故事的 div 的末尾。

我知道这意味着大量的返工,这听起来很复杂,而且需要大量的工作,但是这样做意味着以后会有更大的灵活性,因为您可以重用部分视图,或者您可以一次更改所有视图使用该部分视图现在已更新。

此外,使用 jQuery 意味着添加故事看起来很流畅,没有任何明显的回帖,这很好。

于 2010-01-08T04:39:17.573 回答
0

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

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

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

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

于 2012-04-29T15:27:11.920 回答
0

答案是确保正确设置表单操作。如果您使用了 renderaction 并且没有手动设置表单控制器和操作,那么操作将是当前 URL。

尝试:

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

代替:

<% using (Html.BeginForm()) {%>
于 2012-05-16T01:34:52.490 回答