代码之家  ›  专栏  ›  技术社区  ›  nitinvertigo

如果会话在mvc中过期,则显示ActionFilter弹出窗口

  •  3
  • nitinvertigo  · 技术社区  · 9 年前

    我们使用mvc创建了一个网站,其中我有3个控制器:

    AccountController
    HomeController
    ContactController
    

    我们在ActionFilters中编写了自定义授权,我们正在检查会话是否已过期。如果会话过期,我们将重定向到登录页面。这是ActionFilter中的代码:

    public override void OnAuthorization(AuthorizationContext filterContext)
            {
                var user = filterContext.HttpContext.User;
                var UserProcesses = HttpContext.Current.Session["UserProcesses"] != null ? ((List<string>)HttpContext.Current.Session["UserProcesses"]) : null;
                var currentRequest = filterContext.ActionDescriptor.ActionName.ToLower();
                var currentController = filterContext.RouteData.Values["controller"].ToString();
                if (!string.IsNullOrEmpty(currentController))
                {
                    switch (currentController.ToLower())
                    {
                        case "home":
                            {
                                if (UserProcesses == null)
                                {
                                    filterContext.Result = new RedirectToRouteResult(
                                            new RouteValueDictionary(
                                                new
                                                {
                                                    Controller = "Account",
                                                    Action = "Login"
                                                })
                                            );
                                }
                    break;
             case "contact":
                            {
    
                                if (UserProcesses == null)
                                {
                    filterContext.Result = new RedirectToRouteResult(
                                            new RouteValueDictionary(
                                                new
                                                {
                                                    Controller = "Account",
                                                    Action = "Login"
                                                })
                                            );
                                }
                    break;
    
                }
            }
        }
    

    这非常有效,即当会话到期并且用户点击网站上的任何链接时,他将被重定向到登录页面,其地址为

    http://websitename/Account/Login
    

    但是现在我们想在页面上显示一个弹出窗口(无论用户在哪个页面),它将显示消息“该会话已过期”,在取消该弹出窗口后,用户将被重定向到登录页面。

    我无法确定如何从ActionFilter本身调用Jquery弹出窗口。我在网上搜索了许多解决方案,但找不到正确的解决方案。有人建议使用 处理未授权请求 调用Action方法( Call RedirectToAction from ActionFilter ). 然而,我很困惑是否只使用 处理未授权请求 或同时使用此和 OnAuthorization(启用授权) 在我的代码中。有人能提出解决方案吗?

    注: 我有一个通用的视图,我可以在其中保存html,以便在整个网站上使用。

    2 回复  |  直到 8 年前
        1
  •  2
  •   Community CDub    8 年前

    我正在考虑一个使用变量的解决方案,根据该变量,您将显示或不显示弹出窗口。 我懒得写代码,但我找到了一个描述解决方案的链接:

    ASP.NET MVC Authorize Attribute to launch a modal?

        2
  •  1
  •   taskinoor    8 年前

    还有一种方法可以解决这个问题,即 _Layout.cshtml 文件并放入以下代码:

    <script type="text/javascript">
        jQuery(document).ready(function () {          
    
            var SessionValue = '@Request.RequestContext.HttpContext.Session["YourSessionKey"]';
    
    
            if (SessionValue == "") {
                alert("your session is expired please try to Re-login");
                javascript: document.getElementById('logoutForm').submit();
            }
        });
    </script>
    

    哪里 logoutForm 中注销表单的id _布局.cshtml .