2010-07-27 89 views
2

简介:如何在Asp.net MVC2通过Ajax调用处理UnauthorizedRequest

我在我的框架归类AuthorizeAttribute在我做的自定义授权子。

我正在从正常的asp.net mvc视图渲染切换到通过jQuery进行Ajax渲染的过程。因此,应用程序中的每个链接都会执行ajax调用来获取数据。

为了迎合这一点,我已将大部分页面转换为部分视图,以便每个ajax请求只获取需要在页面上更新的部分。

在正常视图渲染时,当请求未经授权时,它将被重定向到web.config中描述的登录页面。转换为Ajax后,情况有点不同,因为我不想在ajax请求中登录页面的标记,但想要一个结构化的响应,以便我可以在ajax调用中相应地采取行动。

为了做到这一点,我相信我必须重写子类AuthorizeAttribute类中的HandleUnauthorizedRequest方法,并将filterContext.Result设置为json结果。但是在这样做的时候,我将如何区分未经授权的请求和成功的请求,因为从ajax调用的角度来看,这两个都是成功的响应;因此将在成功处理程序中处理。

什么是解决这个问题的正确方法?

回答

6

我刚刚弄明白了,我可以在HandleUnauthorized Request Method中正常请求和ajax请求之间过滤,我在我的AuthorizeAttribute子类中重写了这个请求方法。对于ajax请求,我可以创建一个json结果或其他的东西,对于普通的请求,它仍然会显示登录页面。代码如下:

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest()) 
     { 
      JsonResult UnauthorizedResult = new JsonResult(); 
      UnauthorizedResult.Data = "{ request : 'unauthorized' }"; 
      UnauthorizedResult.JsonRequestBehavior = JsonRequestBehavior.AllowGet; 
      filterContext.Result = UnauthorizedResult; 
     } 
     else 
     { 
      base.HandleUnauthorizedRequest(filterContext); 
     } 
    } 

还是我不会记住我的问题是解决了,所以如果有人可以建议做一个更好的办法,我仍然开放的建议。

+0

好的,在会话过程中,一旦会话过期,会马上恢复正常,登录页面再次作为对ajax请求的响应发送,其状态为成功。因此,我将不得不做一些事情来检测会话已过期,有没有人有任何建议? – Nosh 2010-07-30 04:13:21