【问题标题】:Render view and download file in the same request在同一个请求中渲染视图和下载文件
【发布时间】:2015-08-20 11:58:07
【问题描述】:

当用户完成表单后,用户将被重定向到感谢页面。感谢页面将呈现它的视图,但也会下载文件(pdf / 流)。

我宁愿不使用像这样的 javascript 这样做 return both a file and a rendered view in an MVC3 Controller action,我更希望获得“另存为”对话框。

MVC 有任何可以处理这个问题的约定吗?

【问题讨论】:

  • 您无法向浏览器返回 2 个响应。您可以做的最好的事情是根据链接的答案从视图中触发第二个请求。
  • 页面上的下载按钮不适合的任何具体原因。就我个人而言,我只会将这种行为与狡猾的网站联系起来

标签: c# asp.net-mvc asp.net-mvc-4


【解决方案1】:

正如@BenRobinson 指出的那样,您不能从一个请求中返回两个响应。不,MVC 没有任何约定来处理这个问题,因为它是您正在开发的平台、Internet,特别是 TCP/IP 和 HTTP 协议的基本限制。

从根本上说,网络围绕着所谓的请求-响应周期展开。客户端(通常是 Web 浏览器)向服务器发出请求,该服务器以请求的资源进行响应。您所说的类似于请求-响应-响应,这是不可能的。服务器不能在没有首先收到请求的情况下启动并向客户端发送响应。

因此,您的选择是:

  1. 使用 JavaScript 以编程方式发出另一个请求,例如将 location.href 设置为链接问题的接受答案。

  2. 提供链接/按钮/任何内容以允许用户手动发起文件请求。

就是这样。无论哪种方式,您都需要一个由 JavaScript 或最终用户发起的新请求来获取文件。

【讨论】:

    【解决方案2】:

    你试过元刷新技巧吗?

    <META HTTP-EQUIV='REFRESH' CONTENT='5;URL=http://www.example.com/test.txt'>
    

    记得在浏览器中为要下载的文件设置标题Content-Disposition: attachment

    【讨论】:

    • 不错的收获。我总是忘记元刷新,因为它是如此“90 年代”;它与眨眼标签大约在同一时间离开我的大脑。无论如何,是的,这将是一个完全有效的第三个选项,同样,这是发出第二个请求的另一种方式,这是获得第二个响应所必需的。
    • 我仍然使用这个标签来做很多事情。即使在今天也能很好地工作。
    猜你喜欢
    • 1970-01-01
    • 2020-12-27
    • 2015-04-22
    • 2021-09-13
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    相关资源
    最近更新 更多