2014-02-24 78 views
1

使用JQUERY MVC下载文件。用户点击按钮,我下载文件看起来很简单。下载文件 - 使用JQUERY的Asp.net MVC

我的jQuery的事件

$(document).on("click", "#download", function() { 
    $.blockUI(); 
    window.location = "../Home/Download"; 
    $.unblockUI(); 
    } 

并叫我服务器端

public ActionResult Download() 
    { 
    return File(); 
    } 

一切都很好,除了正在使用Block UI(jQuery插件),以确保用户知道正在下载...“请稍等”

,一旦下载完成,我需要取消阻止用户界面,并让用户保存/打开文件。我如何修改上面的代码来实现这个或任何其他的想法?

当前我的c#代码被调用,并且jquery中的下一行被执行,并且block ui在下一秒离开。我怎么能让这个过程等到下载完成?

回答

1

您不需要window.location。您可以使用jQuery简单地创建一个iframe,并将其url设置为您的操作。可以使用解除UI .load方法。 您还需要在您的html中创建一个隐藏容器,该容器将包含iframe,以便它保持隐藏状态。

<div id="DivIframeContainer" style="display:none;" /> 

$(document).on("click", "#download", function() { 
    $.blockUI();  
var iframe = $("<iframe/>").load(function() { 
    $.unblockUI(); 
}).attr({ 
    src: "../Home/Download" 
}).appendTo($("#DivIframeContainer")); 
    } 
+0

在IE8不工作的问题!任何解决方法? – Peru

+0

你有什么错误吗? –

+0

不是!只是块UI冻结!猜解除阻止用户界面不被称为 – Peru

0

你可以通过AJAX调用你的服务器端。以下是关于如何在进行ajax调用时阻止用户界面的示例。

将Block/Unblock方法附加到$(document).ready函数。每次进行AJAX调用时,UI都将被阻止。

$(document).ready(function() { 

}).ajaxStart(function() { 
    $.blockUI(); 
}).ajaxStop(function() { 
    $.unblockUI(); 
}); 

$(document).on("click", "#download", function() { 
    DownloadFile(); 
} 

function DownloadFile() { 
    $.ajax({ 
     url: "../Home/Download", 
     data: { null }, 
     success: function (data) { 
      //Do something with data that is returned. (The downloaded file?) 
     } 
    }); 
} 
1

用户与文件下载交互的方式应该留给浏览器。

在你的例子中,你的用户界面会告诉他们文件正在下载,实际上浏览器会做同样的事情。

您只需要使用一个锚设置为下载位置在href:

<a href="downloadlinkhere"> Download </a> 
+0

正确!但它仅仅是。加载所以有机会,因为他等待用户可以再次点击某事或同一件事tatz WY正在阻塞UI – Peru

+0

对,但是我的意思是,这是一个浏览器UX问题,而不是编码的问题 - 除非有任何具体的如果你点击两次,你不希望用户下载2次,那么你应该让浏览器做它的事情。 – anthr