jQuery UI Dialog调用操作,返回MVC 3中的HttpContect响应流

我有一个自定义控制器扩展,以返回Excel文件作为HttpContext响应。

我的控制器动作如下:

public ActionResult ExportToExcel() { return this.Excel(headers, results, filename); } 

这与普通的MVC回调完美配合。

我正在尝试创建一个jQuery UI对话框,用户可以在其中输入文件名并按Export。 单击“导出”按钮时,将在控制器中调用MVC操作,但该文件未在浏览器中得到响应。

我的对话框代码是:

 $("#export-excel").dialog({ autoOpen: false, modal: true, title: "Export to Excel", buttons: { Export: function () { $.post("/Search/ExportToExcel", function () { $("#export-excel").dialog("close"); }); } } }); $("#export-excel-button").click(function () { $("#export-excel").dialog("open"); return false; }); 

和HTML:

 
Filename:

问题是,您调用的操作将文件数据作为AJAX函数返回。

您必须强制浏览器定期请求您的操作以触发正常的浏览器下载行为。

最简单的方法是在javascript中设置windows.location.href属性:

 buttons: { Export: function () { $("#export-excel").dialog("close"); window.location = "/Search/ExportToExcel?... 

旁注:您应该使用Url.Action()来生成操作的URL。

如何允许下载文件,该文件从AJAX返回为二进制数据

前几天我遇到了同样的问题。 您对您的操作进行AJAX调用,因此您的文件将在回调函数中返回。 如果您更改按钮方法:

 //... Export: function () { $.post("/Search/ExportToExcel", function (myFileData) { $("#export-excel").dialog("close"); }); } 

您将在myFileData参数中获取文件的binnary数组。 我这样解决了这个问题:

 Export: function () { $("#export-excel").dialog("close"); window.location = "/Search/ExportToExcel?name=" + $('#filename').val(); }   public ActionResult ExportToExcel(string name) { return this.Excel(headers, results, name); }