进行AJAX调用时ActionFilterAttribute出错

时间:2011-12-02 15:20:39

标签: jquery ajax asp.net-mvc-3 model-view-controller action-filter

我正在使用ActionFilter检查用户的会话是否是该用户的最新会话。如果他们已经使用其他会话登录,则旧会话无效。所以,我正在检查每个被调用的动作,如果他们没有使用最新的会话,则将其签名。我遇到的问题是我的方法不适用于AJAX调用。正常的GET或POST调用工作正常。

public class DuplicateLoginFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var user = Membership.GetUser(HttpContext.Current.User.Identity.Name);
        if (user != null)
        {
            if (!PortalDA.GetUserSession(user.UserName).Trim().Equals(HttpContext.Current.Session.SessionID))
            {

                FormsAuthentication.SignOut();
                filterContext.Result = new RedirectResult(@"\Home\SessionExprired");
            }
        }
        base.OnActionExecuting(filterContext);
    }

我想我解决这个问题的最大问题是我得到了一个错误,但我无法抓住它。

我在webconfig中打开了自定义错误。我在所有控制器中覆盖了OnException事件。我还覆盖了global.asax中的Application_Error事件。

我已经完成了代码,当我进行AJAX调用时,我返回了SessionExpired View。但在那之后的某个地方发生了错误,我无法继续前进。错误永远不会被覆盖的错误事件中捕获。然后我被发送到自定义错误页面。

我怀疑它与HTTPHeaders有关,但我不了解他们知道如果它是AJAX调用如何解决它。

谢谢!

1 个答案:

答案 0 :(得分:1)

尝试使用您的路线重定向,而不是硬编码网址:

filterContext.Result = new RedirectToRouteResult(
    new RouteValueDictionary(new 
    {
        controller = "Home",
        action = "SessionExpired"
    }
));

然后确保SessionExpired上的HomeController操作与相应的视图一起存在并且此操作已被命中。显然,由于您在AJAX调用中重定向,因此您在AJAX调用的成功回调中获得的所有内容都是作为参数传递的SessionExpired视图的HTML。不要指望浏览器重定向。您必须使用window.location.href手动重定向浏览器。这就是为什么在这种情况下(AJAX一个)最好返回一个Json结果而不是重定向到一个会话过期的动作。然后在客户端,您可以手动执行重定向。