【问题标题】:Render action return View(); form problem渲染动作 return View();形式问题
【发布时间】:2010-01-07 17:19:26
【问题描述】:

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

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

我为我的评论控制器“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 以列出相关的 cmets)。

一切都如我所愿,除了,当我使用表单发布新评论时,它返回当前(父)视图,但评论表单字段仍显示我输入的最后内容,而 ListStoryComments 视图不是t 更新以显示新故事。

基本上,页面是从缓存中加载的,就好像我按下了浏览器的后退按钮一样。如果我按 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();
        }
    }

【问题讨论】:

  • 我刚刚在观看 Phil Haack 的另一个 MVC 视频,他提到了“PRG”模式(发布、重定向、获取),我认为应该可以解决这个问题。但是,如果我尝试类似'return RedirectToAction("Index");'我收到“不允许子操作执行重定向操作”的错误,所以我仍然很难过。

标签: asp.net-mvc renderaction


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    我个人会;

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

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

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

    【讨论】:

    • 感谢您的回复...这不是我想要的,但感谢您的宝贵时间!
    【解决方案3】:

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

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

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

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

    【讨论】:

      【解决方案4】:

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

      试试:

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

      代替:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-13
        • 1970-01-01
        • 2014-03-13
        • 2014-10-18
        • 2019-05-20
        • 2014-08-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多