Лучший способ обработать конец сеанса с помощью ajax и модальных окон - PullRequest
0 голосов
/ 11 ноября 2010

У меня есть приложение .NET MVC, которое широко использует AJAX и модальные окна. У меня есть фильтр действий, который обрабатывает истечение сеанса пользователя, который перенаправляет на страницу входа. Однако, если запрос сделан из модального окна, возвращаемым результатом действия является страница входа в систему, которая затем загружается в модальное окно.

Я пытался найти способ перенаправить главную страницу на страницу входа в систему по истечении сеанса, но мне не повезло, так как событие Session_End вызывается с сервера и у меня нет доступа к объекту Response. Мне было интересно, сталкивался ли кто-нибудь еще с подобной проблемой, и если да, то как вы ее преодолели?

1 Ответ

0 голосов
/ 02 декабря 2010

Я думаю, что наконец-то нашел решение для этого.Хотя это не так элегантно, как я надеялся, это работает (что больше, чем я нашел до сих пор).Решение лежит вокруг OnBegin AjaxOption и некоторого Jquery.Мой ActionLink (это также может быть Ajax.BeginForm, к которому он применяется) выглядит следующим образом:

<%= Ajax.ActionLink("Do Ajax Function", "AjaxAction", new { }, new AjaxOptions { OnBegin="check_session", OnSuccess = "ajaxSuccess", UpdateTargetId = "update_container"}, new { })%>  

У меня есть действие контроллера в контроллере учетной записи, которое проверяет сеанс, в моем случае я сохраняю пользователяобъект, поэтому я проверяю, является ли он нулевым, и возвращает «True» или «False» в качестве содержимого.OutputCache важен, иначе ваши результаты будут кэшированы.

[OutputCache(Duration=0, VaryByParam="None")]
        public ActionResult CheckAjaxSessionExpired()
        {

            bool _sessionExpired = false;
            if (Session["User"] == null)
            {
                _sessionExpired = true;
            }

            return Content(_sessionExpired.ToString());
        }

Последняя часть - это функция check_session, указанная в качестве обработчика OnBegin.Ajax-вызов Jquery выполняет действие проверки сеанса и проверяет ответ.Если ответ «True» (что означает, что сеанс истек), он устанавливает местоположение страницы обратно на домашнюю страницу (или в данном случае в Google).

function check_session(){

        var url = '<%= Url.Action("CheckAjaxSessionExpired", "Account") %>';


        //GET CHECK SESSION
        $.ajax({
            url: url,
            success: function(data) {

                //alert(data);

                if (data == "True"){
                    document.location = "http://www.google.com";
                }
            },
            error: function() { alert("there was a problem loading the ajax session check"); }
        });
    }

Есть несколько вещей, которые следует запомнитьесли использовать этот метод.Во-первых, это будет выполняться асинхронно.Если у вас есть код, чувствительный к данным, который вы вызываете, вам все равно нужно будет выполнить проверку на стороне сервера в сеансе.Этот код предназначен для простого перенаправления на страницу входа (или домашнюю страницу), если сеанс истек во время вызова ajax.Во-вторых, функция check_session должна быть подключена к событию OnBegin всех ваших вызовов Ajax.Если у кого-то есть какие-либо советы или предложения по улучшению этого метода, я хотел бы услышать их.Надеюсь, это кому-нибудь поможет.

...