最近,我正在研究如何在 Excel 电子表格中下载一大堆数据时向用户提供进度指示器或忙碌指示器。对于大约 3000 行,这大约需要 9-10 秒,因此需要一些东西来让用户感到开心。
我查看了使用 blockUI,这首先很棒,但我遇到的问题是如何在收到文件确认后解除阻止 UI。我读了一篇好文章:
所以我最终使用了 jquery cookie 和 blockUI。我还有一个动画 gif,由于某种原因,它在 Firefox 下不显示,但在 IE8 下显示(!!!!)。完全不同的问题。
现在从表面上看,那篇文章中的代码有效。我做了一个测试应用程序,一切都很好,但是当我将它应用到我正在编写的应用程序时,它无法删除 cookie。事实证明,当我在栏中有完整的 url 时,它不喜欢:
http://localhost:4790/Home.aspx/Index ^^ Global.asax.cs 已更改,因为此应用程序将部署在 IIS6 上。
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}.aspx/{action}/{id}",
//"{controller}/{action}/{id}", // URL with parameters
new { action = "Index", id = "" } // trying for IIS6
//new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
// New - trying for IIS6
routes.MapRoute(
"Root",
"",
new { controller = "Home", action = "Index", id = "" }
);
}
/*
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
* */
在控制器中,对于索引操作,我有:
public ActionResult Index()
{
return View();
}
在家庭控制器中,我有一个方法,我正在“伪造”发回一个文件。它还将cookie“fileDownloadToken”设置为“export”值。
public ActionResult GetFile()
{
Thread.Sleep(5000);
byte[] test = new byte[1000];
this.Response.AppendCookie(new HttpCookie("fileDownloadToken", "export"));
return File(test, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "test.xlsx");
}
索引视图的内容是:
@{
ViewBag.Title = "Home Page";
}
<input id="save_button" type="button" value="Get" onclick='window.location.href=("@Url.Action("GetFile")")' />
<script type="text/javascript">
$(document).ready(function () {
$('#save_button').click( function () {
$.blockUI({
message: $('#loading')
});
blockUIForDownload();
});
});
var fileDownloadCheckTimer;
function blockUIForDownload() {
fileDownloadCheckTimer = window.setInterval(function() {
var cookieValue = $.cookie('fileDownloadToken');
if (cookieValue == "export")
finishDownload();
}, 100);
}
function finishDownload() {
window.clearInterval(fileDownloadCheckTimer);
$.cookie('fileDownloadToken', null);
$.unblockUI();
}
</script>
<div id="loading" style="display: none;">
<br />
<img src="@Url.Content("~/Content/Images/loading.gif")" /><br />
<h2>Exporting, Please Wait...</h2>
</div>
现在,正如我上面所说,当您直接浏览到 localhost: 时,它可以工作,正如 VS2010 所指定的那样,但是当您浏览到 localhost:/Home.aspx/Index 时它会失败。
我在 IE8 上使用开发人员工具进行调试,并使用警报等来提醒 cookie 的值,即使在调用 $.cookie("XXXX", null) 后 cookie 值仍然存在。我想如果这是某种路径/域问题,那么您将根本无法获取 cookie 的值,因此恰恰相反,用户界面在您按下按钮后立即解除阻塞,但是