在mvc ajax中注销视图

时间:2014-03-02 17:12:35

标签: jquery ajax asp.net-mvc asp.net-mvc-4 razor

我使用MVC4 razor构建了一个网站,我使用两种动作链接来重定向视图。 “@ Ajax.ActionLink”和“@ Html.ActionLink”。我有一个单独的注销视图,问题是,如果我正在调用@ Ajax.Action链接和会话已过期的视图,那么我的注销页面将在内部打开到主布局视图。我想在一个单独的视图中打开一个注销视图,每当我使用局部视图时都会发生同样的事情。

请告诉我如何使用ajax.actionlink解决此问题,或者在单独的视图中打开部分视图注销页面。

提前致谢..

1 个答案:

答案 0 :(得分:1)

您需要做的是涉及服务器端和客户端编码。

首先,在服务器端,您需要捕获用户会话已经过期的请求,并且他们正在使用ajax。

如果您使用的是标准身份验证属性,则可以将其扩展为:

 public class AjaxAuthorizeAttribute : AuthorizeAttribute
    { 
        private class Http401Result : ActionResult
        {
            public override void ExecuteResult(ControllerContext context)
            { 
                context.HttpContext.Response.StatusCode = 401;
                context.HttpContext.Response.Write("Your session has expired. Please login again to continue.");
                context.HttpContext.Response.End();
            }
        }

        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            if (filterContext.HttpContext.Request.IsAjaxRequest())
            {
                filterContext.Result = new Http401Result();
            }
            else
            {
                base.HandleUnauthorizedRequest(filterContext);
            }
        }

    }

在您的Controller或Action上使用该属性而不是Authorize

现在到客户端,当一个请求从服务器返回时,你想要捕获它并做一些事情,让我们使用Ajax设置:

坚持这个人总会跑:

$(document).ready(function () {

    $.ajaxSetup({
        cache: false
    });

    $(document).ajaxError(
        function (e, request) {
            if (request.status == 401) {
                alert("Your session has expired. Please login again to continue.");
                window.location = "/account/logon"; 
            } else {

            }
        }
    );
}

你做完了。