通过在ASP.NET MVC中发布JSON数据下载CSV文件

通过在ASP.NET MVC中发布JSON数据下载CSV文件,asp.net,asp.net-mvc,json,download,http-post,Asp.net,Asp.net Mvc,Json,Download,Http Post,在ASP.NETMVC中,我试图通过post下载文件并发送JSON数据。这些JSON数据是通过knockout.js在页面上显示的数据的过滤器。critieria对象始终为空。如何通过javascript或表单post发送post数据来下载文件?我使用GET完成了ajax下载,但现在我有了额外的数据,比如我需要发布的数组 表格 <form method="POST" action="@Model.ExportUrl" > <input type="hidden" nam

在ASP.NETMVC中,我试图通过post下载文件并发送JSON数据。这些JSON数据是通过knockout.js在页面上显示的数据的过滤器。critieria对象始终为空。如何通过javascript或表单post发送post数据来下载文件?我使用GET完成了ajax下载,但现在我有了额外的数据,比如我需要发布的数组

表格

<form method="POST" action="@Model.ExportUrl" >
    <input type="hidden" name="criteria" data-bind="value: ko.toJSON(data())"  />
    <button class="btn"><i class="icon-download-alt"></i> Export</button>
</form>
控制器

[HttpPost]
public virtual ActionResult Export(int eventId, DivisionTeamsTableCriteria criteria)
{

您可以尝试像这样将表单发布到Iframe

在iframe asp.net页面上,您可以这样编写响应文件

  • Iframe可以是1x1像素

我使用knockout.js创建了这个效果非常好的自定义绑定

ko.bindingHandlers.download = {
        init: function (element, valueAccessor) {

            var value = ko.utils.unwrapObservable(valueAccessor()),
                id = 'download-iframe-container',
                iframe;

            $(element).unbind('click').bind('click', function () {

                iframe = document.getElementById(id);

                if (!iframe) {
                    iframe = document.createElement("iframe");
                    iframe.id = id;
                    iframe.style.display = "none";
                }

                if (value.data) {
                    iframe.src = value.url + (value.url.indexOf('?') > 0 ? '&' : '?') + $.param(ko.mapping.toJS(value.data));
                } else {
                    iframe.src = value.url;
                }

                document.body.appendChild(iframe);

                return false;
            });
        }
    };

有趣,但我不认为这能解决JSON问题。哪个JSON问题?在代码背后解析JSON?注意,我在上面粘贴的请求底部发送原始JSON作为参数。
ko.bindingHandlers.download = {
        init: function (element, valueAccessor) {

            var value = ko.utils.unwrapObservable(valueAccessor()),
                id = 'download-iframe-container',
                iframe;

            $(element).unbind('click').bind('click', function () {

                iframe = document.getElementById(id);

                if (!iframe) {
                    iframe = document.createElement("iframe");
                    iframe.id = id;
                    iframe.style.display = "none";
                }

                if (value.data) {
                    iframe.src = value.url + (value.url.indexOf('?') > 0 ? '&' : '?') + $.param(ko.mapping.toJS(value.data));
                } else {
                    iframe.src = value.url;
                }

                document.body.appendChild(iframe);

                return false;
            });
        }
    };