Возникла проблема с удалением файлов cookie в ASP.NET MVC3 с / jquery.cookies и IIS6 - PullRequest
2 голосов
/ 25 февраля 2012

Недавно я изучал, как можно предоставить пользователю индикатор прогресса или индикатор занятости при загрузке целой пачки данных в электронную таблицу 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, поэтому все наоборот, пользовательский интерфейс разблокируется сразу после нажатия кнопки, но

...