阻止jQuery模式弹出窗口打开会话超时MVC4

时间:2013-08-16 11:31:49

标签: asp.net-mvc jquery modal-dialog

我有一个ASP.NET MVC 4应用程序,其中我在会话超时过滤器处理程序中捕获会话超时以处理会话超时。我还想处理ajax请求的会话超时。我最初实现了我在question here中找到的代码。

最初用于自动填充和其他ajax调用的处理,但唯一的问题是ajax调用模态弹出窗口!

所以现在我已经将会话超时处理程序更改为:

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    if (filterContext.HttpContext.Session != null)
    {
        if (filterContext.HttpContext.Session.IsNewSession)
        {
            var sessionStateDetails =(SessionStateSection)ConfigurationManager.GetSection("system.web/sessionState");
            var sessionCookie = filterContext.HttpContext.Request.Headers["Cookie"];

            if ((sessionCookie != null) && (sessionCookie.IndexOf(sessionStateDetails.CookieName) >= 0))
            {
                if (filterContext.HttpContext.Request.IsAjaxRequest())
                {
                    filterContext.HttpContext.Response.Clear();
                    filterContext.HttpContext.Response.StatusCode = 500;

即。将状态代码设置为500(401对我没有用,因为我正在使用Windows身份验证和模拟,所以如果我将状态更改为401,我会获得密码和用户名的安全弹出窗口。)

然后我将其捕获到.ajaxSetup或.ajaxError中我已经尝试了两个...并重新指向我的会话超时操作(根据需要)以显示具有会话超时的视图。

$(document).ajaxError(function (xhr, props) {
    if (props.status === 500) {
        ////session redirect goes here 
        var pathArray = window.location.pathname.split('/');
        var segment_1 = pathArray[1];
        var newURL = window.location.protocol + "//" + window.location.host + "/" + segment_1 + "/Home/SessionTimeout";
        window.location = newURL;
    }
});

问题出在重定向之前,ajax弹出窗口仍然是短暂打开的。所以它看起来不太棒。知道我怎么能阻止它开放并顺利重新指挥?

这是我的jQuery对话框代码:

$(document).ready(function () {
    $(".openDialog").live("click", function (e) {
        e.preventDefault();
        $("<div></div>")
            .addClass("dialog")
            .attr("id", $(this)
            .attr("data-dialog-id"))
            .appendTo("body")
            .dialog({
                title: $(this).attr("data-dialog-title"),
                close: function () { $(this).remove() },
                width: 600,
                modal: true,
                height: 'auto',
                show: 'fade',
                hide: 'fade',
                resizable: 'false'
            })
        .load(this.href);

    });

    $(".close").live("click", function (e) {
        e.preventDefault();
        $(this).closest(".dialog").dialog("close");
    });
});

任何帮助都会受到赞赏,我想我几乎就是这样。

2 个答案:

答案 0 :(得分:2)

我设法让这个工作最终,如果其他人有同样的问题,这就是我做的...我继续使用会话处理程序,但我现在提高403而不是500,因为提高500显然是错误的并且有一些不良副作用:

来自

的代码
                if (filterContext.HttpContext.Request.IsAjaxRequest())
                {
                    filterContext.HttpContext.Response.Clear();
                    filterContext.HttpContext.Response.StatusCode = 403;

                }
                else ...usual code goes here ....

然后我捕获ajax错误如下:

$(document).ajaxError(function (xhr, props) {
    if (props.status == 403 ) {
        ////session redirect goes here 
        var pathArray = window.location.pathname.split('/');
        var segment_1 = pathArray[1];
        var newURL = window.location.protocol + "//" + window.location.host + "/" + segment_1 + "/Home/SessionTimeout";
        window.location = newURL;
    }
});

当然,我的弹出窗口仍会尝试在重新指示之前加载最短暂的时刻,但我的用户似乎并不介意。

答案 1 :(得分:0)

删除覆盖public override void OnActionExecuting(ActionExecutingContext filterContext)并使用(在global.asax中):

    protected void Application_EndRequest(object sender, EventArgs args)
    {

        HttpContextWrapper context = new HttpContextWrapper(Context);
        if (context.Response.StatusCode == 302 && context.Request.IsAjaxRequest())
            context.Response.RedirectLocation = string.Empty;
        //MiniProfiler.Stop();
    }

并在您的JavaScript中:

$.ajaxSetup({ //jQuery.ajaxSetup({
    statusCode: {
        302: function () {
            __userLoginEvent = true;
        }
    }
});

$(document).ajaxStop(function () {
    if (__userLoginEvent) {
        //your redirection here

        __userLoginEvent = false;
    }
})

我使用ajaxStop因为如果您是多个ajax调用,则需要一个重定向。这对我来说很完美。