我是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();
}
}
答案 0 :(得分:3)
答案是使用return RedirectToAction()。使用它可以强制执行PRG模式并实现我的目标。
我之前对原帖的评论确实导致错误,我想我仍然感到困惑,但是这样做有效:
return RedirectToAction("Details", "Steps", new { id = "2" });
答案 1 :(得分:1)
我,这是一个个人意见,认为你以错误的方式解决了这个问题。
就我个人而言;
我知道这意味着需要进行大量的重复工作,这听起来很复杂并且需要做很多工作,但这样做会意味着以后会有更大的灵活性,因为您可以重复使用部分视图,或者您可以进行一次更改现在更新了使用该部分视图的所有视图。
另外,使用jQuery意味着添加故事看起来似乎没有任何明显的帖子,这很好。
答案 2 :(得分:0)
由于问题似乎是缓存,您可以简单地禁用/限制缓存。
将以下属性添加到您的操作中:
[OutputCache(Duration = 0, VaryByParam = "none")]
这将告诉浏览器缓存页面,但是持续0秒。当帖子重新加载页面时,您应该看到所需的结果。
答案 3 :(得分:0)
答案是确保正确设置表单操作。如果您使用了渲染并且未手动设置表单控制器和操作,则操作将是当前URL。
尝试:
<% using (Html.BeginForm("ActionName", "ControllerName")) {%>
而不是:
<% using (Html.BeginForm()) {%>