Недавно я изучал, как можно предоставить пользователю индикатор прогресса или индикатор занятости при загрузке целой пачки данных в электронную таблицу Excel.Для ~ 3000 строк это занимает около 9-10 секунд, следовательно, необходимо что-то, чтобы развлечь пользователя.
Я смотрел на использование blockUI, и это здорово, во-первых, но проблема была в том, как разблокироватьПользовательский интерфейс после подтверждения файла.Я прочитал хорошую статью:
http://geekswithblogs.net/GruffCode/archive/2010/10/28/detecting-the-file-download-dialog-in-the-browser.aspx
Так что в итоге я использовал 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
);
}
* */
В Контроллере для действия Index у меня есть:
public ActionResult Index()
{
return View();
}
, а в Home Controller, опять же, у меня есть метод, который я подделываюmsgstr "отправка файла обратно.Это также устанавливает для 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 остается даже после вызова $ .cookie («XXXX», null).Я полагаю, что если бы это была какая-то проблема с маршрутизацией / доменом, то вы вообще не смогли бы получить значение cookie, поэтому все наоборот, пользовательский интерфейс разблокируется сразу после нажатия кнопки, но