覆盖Application_PreRequestHandlerExecute

时间:2016-06-23 10:34:46

标签: asp.net-mvc-5 global-asax custom-action-filter

我已经继承了一个应用程序,如果会话已经过期,它会使用Application_PreRequestHandlerExecute重定向到登录。

目前有一个硬编码网址列表,不应该调用重定向。本质上,这些是返回json的ajax方法,所以它们在javascript中单独处理。

我想更改机制,以便默认(在Application_PreRequestHandlerExecute中)保持不变,但ActionFilters可以在适当的Actions上控制替代行为(即对应于硬编码的url列表的行为)。

如何检查Application_PreRequestHandlerExecute中是否存在特定的ActionFilter?

编辑:也许我需要用全局动作过滤器替换Application_PreRequestHandlerExecute?

1 个答案:

答案 0 :(得分:0)

简短的回答是替换为全局动作过滤器。

在其中,filterContext拥有我需要的一切。

编辑:这是我的目的所在:

public enum SessionExpiredBehaviour
{
    Redirect,
    Ignore,
    JSON
}


[AttributeUsage(AttributeTargets.Method)]
public class SessionExpiredFilterAttribute : ActionFilterAttribute
{
    public SessionExpiredBehaviour Behaviour { get; set; } = SessionExpiredBehaviour.Redirect;

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {

        if (HttpContext.Current.Session["User"] == null)
        {
            switch (this.Behaviour)
            {

                case SessionExpiredBehaviour.Redirect:
                    filterContext.Result =
                        new RedirectToRouteResult(new RouteValueDictionary
                        {
                            { "action", "RedirectToLogin" },
                            { "controller", "Account" }
                        });
                    break;

                case SessionExpiredBehaviour.JSON:
                    //TODO
                    break;
            }

        }
        base.OnActionExecuting(filterContext);

    }
}