在MVC操作筛选器中的会话超时后重定向

时间:2016-06-14 05:52:06

标签: asp.net-mvc-4 session-state actionfilterattribute

我必须在mvc 5应用程序中的会话超时后重定向到主页。我使用以下代码:

 public class SessionExpireAttribute : ActionFilterAttribute
    {

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {

            var currentEnvironment = EnvironmentUtility.GetSession().Get<Environment>();
            if (currentEnvironment == null)
            {
                filterContext.Result = new RedirectResult("~/Home/Index");
            }
            base.OnActionExecuting(filterContext);
        }

    }

在控制器中,我有以下代码:

[SessionExpire]
public ActionResult Submit()
{
    var urlReferrer = this.Request.UrlReferrer;
    if (urlReferrer != null)
    {
     return this.Redirect(urlReferrer.ToString());
    }
    else
    {
        return View();
    }
}

点击提交按钮后,页面将使用javascript代码重定向到另一个页面,如下所示:

 function commitButtonClickedHandler()
{
       window.location.href = "@Url.Content("~/Working/NextPage")";
}

NextPage如下所示:

public ActionResult NextPage()
        {
            return this.View();
        }

我的要求是在会话超时后,当您单击提交按钮时,它应该检查到期时间到期。如果它已过期,则应将其重定向到NextPage,就像在SessionExpireAttribute中一样。否则它应该继续该过程。但问题是在会话超时后,页面仍然重定向到NextPage()动作。请帮我解决这个问题。 谢谢。

1 个答案:

答案 0 :(得分:0)

您可以通过覆盖OnActionExecuting进行更改,如下所示:

public class SessionExpireAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {            
            if ( Session["SomeSession"] == null)                    
            {
                //ClearAllSessions
                GoToLoginPage(filterContext, "You Session has been expired");
                return;
            }           
    }

    private static void GoToLoginPage(ActionExecutingContext filterContext, string message)
    {
        try
        {           


          filterContext.Result = new RedirectToRouteResult(
                 new RouteValueDictionary 
            { 
                { "controller", "controllerName" }, 
                { "action", "actionName" } ,
                { "Area","" },
                { "UnauthLogin",message },

            });
            }
        }
        catch
        {
            filterContext.Result = new RedirectToRouteResult(
                   new RouteValueDictionary 
            { 
                { "controller", "controllerName" }, 
                { "action", "actionName" } ,
                { "Area","" },
                { "UnauthLogin",message },

            });
        }
    }
 }