通过MVC控制器下载文件

时间:2011-04-21 21:19:23

标签: jquery asp.net-mvc json download

我正在为我们接手的项目修改一些MVC代码,我没有的MVC经验。

应用程序显示一个表格,其中包含可以选择的项目。这些项目将传递给控制器​​,控制器将创建包含这些项目的下载文件。以前,这些项目是通过QueryString传递的,除非做出很多选择,否则这很好。 IE的URL限制为~2048个字符,每个项目长度约为30个字符,因此下载70个项目会导致问题(截断的查询字符串)。

我修改了javascript以通过Ajax将数据传递给控制器​​。这工作正常,但现在当数据返回到页面时,没有显示下载窗口。

旧的javascript看起来像这样:

 function doDownload(url)
 {
     var data = AppendItems();
     url = url;
     var mybars = "directories=no,location=no,menubar=no,status=no";
     mybars += ",titlebar='',toolbar=no,alwaysraised=yes,maximize=no";
     var myoptions = "scrollbars=yes,fullscreen,resizable=yes";
     var myfeatures = mybars + "," + myoptions;


     if (!newWindow || newWindow.closed()) {
         newWindow = window.open(url + data, "DownloadIncomingFile", myfeatures);
         newWindow.focus();
     }
 }

我已将该列表转换为:

$.ajax({
    type: "POST",
    url: "DownloadIncomingWires/Download",
    data: { 
        filePaths: filePaths,
        completeStatus: completeStatus 
    },
    traditional: true
});

这是成功地将数据发送到控制器,我只是不知道在VIEW端做什么来显示典型的“下载”窗口。

每当我添加window.open片段时,我都会收到404错误。没有它,我什么也得不到。

1 个答案:

答案 0 :(得分:1)

如果你按照ajax加载这个,你就不会得到一个下载窗口。因为jquery处理内部已回答的文档。

window.open方法是我的理由不正确的方法。因为用户看到了一个不需要的弹出窗口。

我的解决方案是使用下载文件(控制器)的URL设置iframe

所以在jQuery中:

doDownload = function(url) {
   var dframe = jQuery('#downloadframe');
   if(dframe.length < 0) {
      jQuery('body').append('<iframe style="position:absolute; left:-10000px; visible:hidden;" src="'+url+'" id="downloadframe" />');
   } else {
      dframe.attr('src',url);
   }
};

您的控制器必须将内容类型设置为:application / force-download或已提供文件的Content-type。

祝你好运