【问题标题】:Log out view in mvc ajax在 mvc ajax 中注销视图
【发布时间】:2014-03-02 17:12:35
【问题描述】:

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

请让我知道如何使用 ajax.actionlink 解决此问题,否则部分视图注销页面将在单独的视图中打开。

提前谢谢..

【问题讨论】:

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


    【解决方案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

    现在到客户端,当请求从服务器返回并带有 401 响应时,您想要捕获它并做一些事情,让我们使用 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 {
    
                }
            }
        );
    }
    

    你就完成了。

    【讨论】:

    • 嗨,我不需要对 ajax 操作链接做任何更改吗?我的 ajax 动作链接是这样的:@Ajax.ActionLink("Actiontext", "Actionname", "Controllername", new AjaxOptions { OnBegin = "ajaxStart", OnComplete = "ajaxStop", UpdateTargetId = "form" } })
    • 应该没问题,只要是通过ajax调用服务器,ajaxError应该可以捕获错误请求。试一试,看看效果如何。
    • 我已经实现了你的代码并做了一些谷歌搜索。但我收到此错误:

      Error.

      路径控制器 '/.../登录.aspx'未找到或未实现 IController。

      ....我忽略了 global.aspx 中的路由路径,但仍然出现错误..
    • 确保将此行更改为登录屏幕(或其他)window.location = "/account/logon"; 的路径
    • 我通过在 web config 中提到的授权模式解决了这个问题。现在遇到另一个问题,我总是重定向到注销视图。我的意思是在你给定的服务器代码上,我总是进入我是否登录的 else 部分,我总是重定向到注销的视图并不重要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 2012-08-10
    相关资源
    最近更新 更多