使用POST请求而不是GET下载文件

Tim*_*don 3 asp.net-mvc

我有一个ASP.NET MVC应用程序.在一个页面上,我有一个按钮,允许用户根据用户设置的页面上的某些值(滑块范围,复选框等)下载CSV文件,而无需离开页面.我的Controller类通过返回FileResult的方法返回该文件.

目前,我的javascript onClick方法实现如下,有点jQuery:

function DownloadCSV() {
    var url = <%=Action("DownloadCSV", "Controller")%> + '?' +
                  $.param({
                      SomeValue: $("#valuefromform").val(),
                      OtherValue: $("#anothervaluefromform").val(),
                      ...
                  });

    window.location = url;
}
Run Code Online (Sandbox Code Playgroud)

这部分工作得很好,所以问题是:是否可以重写这个方法,以便它"发布"查询而不是使用"获取"查询字符串?

(我已经尝试过使用一个AJAX请求,它可以很好地POST,但是虽然我得到了文件数据,但这是XHR响应的一部分,我无法弄清楚如何将其下载为文件,所以如果有办法这样做也会很棒!)

Dar*_*rov 9

您可以设置一个表单:

<% using (Html.BeginForm("DownloadCSV", "Controller", null, FormMethod.Post, new { id = "myform" })) { %>
    <input type="hidden" id="someValue" name="someValue" value="" />
    <input type="hidden" id="otherValue" name="otherValue" value="" />
<% } %>
Run Code Online (Sandbox Code Playgroud)

下载时间只需提交此表格:

function DownloadCSV() {
    $('#someValue').val($('#valuefromform').val());
    $('#otherValue').val($('#anothervaluefromform').val());
    $('#myform').trigger('submit');
}
Run Code Online (Sandbox Code Playgroud)

另一种可能性是完全动态地构建此表单并在提交之前将其注入DOM.