0

我有一个属性 SessionEndAttribute,用于检查会话是否处于活动状态。它附加到每个动作。

如果会话已过期,它将运行此方法:

 public override void OnActionExecuting(ActionExecutingContext filterContext) {
   // do logout, clear cookies
   filterContext.Result = new RedirectToRouteResult( .. )
 }

但有时响应不是到新页面的路由(例如路由“/Account/Login”),而只是一个弹出窗口或部分视图,可能只是一个容器 div。

所以,问题是 - 我怎样才能总是重定向到新页面?

4

1 回答 1

0

你必须告诉这个特定的 actionfilter 只运行完整的控制器动作而不是部分控制器动作[ChildActionOnly]

您还必须确保所有 AJAX 调用都使用这些[ChildActionOnly]调用。

上下文中应该有一个布尔属性IsChildAction帮助你。

正如 Andriy 在评论中指出的那样,您还应该检查并确保filterContext没有执行 AJAX 请求,使用ifilterContext.HttpContext.Request.IsAjaxRequest()

用法:

public override void OnActionExecuting(ActionExecutingContext filterContext) {
   // do logout, clear cookies
   if (!filterContext.IsChildAction && !filterContext.HttpContext.Request.IsAjaxRequest()) {
       filterContext.Result = new RedirectToRouteResult( .. )
   }
}
于 2013-05-22T12:35:36.747 回答