代码之家  ›  专栏  ›  技术社区  ›  Alex

ASP.NET MVC:所有POST请求都需要返回一些内容吗?

  •  1
  • Alex  · 技术社区  · 16 年前

    我有一个ASP.NET MVC应用程序,它有一个通过POST提交表单值的视图。当我的控制器操作方法接收到发布的数据时,它只处理服务器端的事务,不需要向客户端反馈。

    但是,我必须返回actionresult。如果我返回null或emptyresult,那么在提交表单后,页面将变为空白。我可以返回视图,但构建起来相当“昂贵”,所以我想知道是否有一种方法可以简单地发布值,然后让浏览器不期望得到任何回报?

    5 回复  |  直到 8 年前
        1
  •  2
  •   paracycle    16 年前

    客户机发出的POST(甚至GET)请求意味着客户机需要从服务器返回响应。如果客户机得到一个空的回复,它将显示一个空页面。对于您在客户端使用的任何框架,都无法解决这个问题。

    但是,正如其他人所指出的,您有一些选择:

    1. 你可以使用 异步开机自检 (通过Ajax)将post请求发送到服务器端。这样客户 发送邮件请求并 需要返回响应,但这不会影响客户端所在的页面。可以说,整个过程都是在另一个线程上完成的,因此,如果不返回响应就不重要了。您可以考虑使用与MVC包捆绑在一起的jquery客户端库来轻松实现这一点。

    2. 你可以使用 后重定向获取 模式。在此方法中,客户机将执行POST请求并等待响应。但是,您的后处理操作方法不会返回具体的答案,而是将重定向结果返回到get handling操作方法,因此客户端将请求并等待其响应,反过来,get handling操作方法将构造视图并返回它。作为回报,客户端将显示该视图。

      但是,我相信您的视图生成逻辑是昂贵的,因此您不想一次又一次地生成它。在这种情况下,您可以使用的选项之一是使用服务器端 output caching 从get处理方法缓存视图输出。这样,即使使用后重定向获取模式,也不会一次又一次地重建视图。

    现在让我快速回顾一下每种选择的优缺点。

    赞成的意见:

    1. 易于实现;与客户机之间的通信量少得多;客户机页面不会不断重新加载。
    2. 同样适用于所有浏览器;如果您的视图稍后需要根据您的发布请求进行更改,则可以更容易地将其集成到该模式中。

    欺骗:

    1. 需要在客户机中启用(和兼容)javascript(如果您的目标是移动设备,这可能是一个问题);由于您在不同的层上传播逻辑,因此很难调试和维护。
    2. 更为健谈的是,客户机之间的通信量更大;您需要对输出缓存方法进行微调,以避免最终提供过时(甚至错误)的内容。
        2
  •  3
  •   swilliams    16 年前

    考虑使用Ajax发布数据。使用jquery或内置的MVC Ajax工具可以很容易地做到这一点。

    或者,直接重定向到另一个页面(可能是同一个页面?)在你的后期处理程序中。无论如何,这可能是所需的方法;如果有人在填写表单后刷新页面,则不会显示“重新发送表单”对话框。这被称为 Post-Redirect-Get Pattern (或PRG)。

        3
  •  2
  •   Mehrdad Afshari    16 年前

    您应该考虑使用Ajax技术发布表单,比如 jquery.post .

        4
  •  1
  •   vishwajeetrkale    8 年前

    快速修复此问题,只需将已创建的视图返回给用户,如在发布后重定向到主页或重定向到GeT页。

        5
  •  0
  •   twk    16 年前

    传统的后置操作是一个命令,浏览器可以发送数据并接收返回的内容。 考虑使用Ajax技术作为一种优雅而简单的解决方案。

    编辑: Post不应返回HTML内容响应!它应该只发布数据,然后重定向以获取新页面(可能是同一个URL)

    推荐文章