从HttpPost Asp.Net MVC方法返回保存的文件

我有一个Asp.Net MVC项目,在其中的一页上,用户可以将加载的数据编辑到表中(更改图像,字符串,项目顺序等)。

完成所有编辑后,客户端按下“下载”按钮,并将生成的xml文件保存在其硬盘驱动器上,以便将来进行下一次操作。

所以我有一个简单的HTML格式:

{{data.Items[$index].Id}}

此表单数据通过angularJs函数调用发送,如下所示:

 $scope.sendForm = function () { // some preparations to send image data through json for (var i = 0; i < $scope.data.Items.length; i++) { $scope.data.Items[i].ImageAsString = $scope.data.Items[i].Image; } $http.post("Download", { array: $scope.data }) .success(function (responseData) { console.log(responseData); }) .error(function (responseData) { console.log("Error !" + responseData); }); }; 

调用此函数后,准备好的http post请求发送到asp.net mvc 下载操作:

  [HttpPost] public FileResult Download(ItemsArrayWrapper array) { // here goes incoming data processing logic // ... return File(array.ConvertToItemsArray().Serialize(), "text/xml", name); } 

我希望我的Download方法返回FileResult,因此,客户端上将出现一个文件保存对话框。 但什么都没发生。

我已经尝试构造各种Response头,返回不同的MimeTypes,更改Download方法的返回类型,甚至尝试从Download方法调用[HttpGet]方法,但客户端上仍然没有出现任何内容。

在浏览器网络监控中搜索 – 只发送一个POST请求。

是否有可能将数据从HttpPost方法发送到客户端,这是以这种方式从angularJs函数调用的? 我缺少什么,以及为什么在浏览器中没有显示保存对话框?

或者,任何人都可以提出任何其他更合适的解决方

我希望我的Download方法返回FileResult,因此,客户端上将出现一个文件保存对话框。 但什么都没发生。

没有任何事情发生是正常的。 我建议你不要使用AJAX下载文件。 只需构建一个普通的隐藏HTML表单,然后将此表单自动提交到Download控制器操作。 然后将出现“文件保存”对话框,提示用户保存文件。

如果你绝对需要使用AJAX这样做,那么应该注意你可以使用HTML5 FileAPI ,它允许你在AJAX回调中保存二进制响应。 但请注意,这仅适用于现代浏览器,如果您需要在网站中支持某些旧浏览器,则无论如何都需要第一种方法。