【问题标题】:Best way to handle session end with ajax and modal windows使用 ajax 和模态窗口处理会话结束的最佳方法
【发布时间】:2012-05-03 01:42:10
【问题描述】:

我有一个广泛使用 AJAX 和模式窗口的 .NET MVC 应用程序。我有一个操作过滤器来处理重定向到登录页面的用户会话的到期。但是,如果请求是从模态窗口发出的,则返回的操作结果是登录页面,然后加载到模态窗口中。

我一直在尝试找到一种方法,以便在会话到期时将主页重定向到登录,但我没有这样的运气,因为 Session_End 事件是从服务器触发的,我无法访问 Response 对象。我想知道是否有其他人遇到过这样的问题,如果有,您是如何克服的?

【问题讨论】:

  • 你不能在登录页面中检查你是否在模式对话框中运行,如果是这样,使用 javascript 来刷新整个页面而不是仅仅刷新模式对话框? (不知道该怎么做,所以没有添加答案:))。
  • 我已经对此进行了研究,但问题是请求的上下文(以及随后的响应)是模态对话框。我没有访问页面上下文来重定向它,只能重定向到模态窗口。

标签: .net ajax session modal-dialog


【解决方案1】:

我想我终于找到了解决方案。虽然它不像我希望的那样优雅,但它确实有效(这比我迄今为止发现的要多)。解决方案在于 OnBegin AjaxOption 和一些 Jquery。我的 ActionLink(它也可能是应用到的 Ajax.BeginForm)看起来像这样

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

我的帐户控制器中有一个控制器操作来检查会话,在我的情况下,我正在存储用户对象,所以我检查它是否为空,并返回“真”或“假”作为内容。 OutputCache 很重要,否则您的结果将被缓存。

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

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

            return Content(_sessionExpired.ToString());
        }

最后一部分是指定为 OnBegin 处理程序的 check_session 函数。 Jquery ajax 调用命中会话检查操作并检查响应。如果响应为“真”(意味着会话已过期),则将页面的位置设置回主页(在这种情况下为 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 函数需要连接到所有 Ajax 调用的 OnBegin 事件中。如果有人对改进此方法有任何提示或建议,我很想听听。我希望这对某人有所帮助。

【讨论】:

    猜你喜欢
    • 2010-12-05
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    相关资源
    最近更新 更多