2009-09-08 47 views
3

默认情况下,MVC授权属性设置HttpContext.Response.StatusCode = 401,当用户未被授权并且web.config中的部分路由到loginUrl属性时。ASP.NET MVC中有没有办法处理不同的Response.StatusCode值?

我想与其他响应代码做类似的事情。例如,我有一个名为ActiveAccount的属性,它验证用户的帐户当前处于活动状态,然后允许他们访问控制器。如果它们不活动,我想将它们路由到特定的控制器并查看(更新其帐户)。

我想复制授权属性的方式来处理此问题,并将StatusCode设置为410(警告:先前的数字拉出空气),并让用户路由到web.config中定义的位置文件。

我能做些什么来实现这种行为?还是有一个更简单的方法?

编辑:结果

我结束了回避的StatusCode和从属性中只是进行重定向,因为这是要简单得多。这里是我的代码简而言之:

// using the IAuthorizationFilter allows us to use the base controller's 
// built attribute handling. We could have used result as well, but Auth seems 
// more appropriate. 
public class ActiveAccountAttribute: FilterAttribute, IAuthorizationFilter 
{ 

    #region IAuthorizationFilter Members 

    public void OnAuthorization(AuthorizationContext filterContext) 
    { 

     if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
      return; 

     // ... code which determines if our customer account is Active 

     if (!user.Status.IsActive) 
      filterContext.Result = new RedirectToRouteResult("Default", new RouteValueDictionary(new {controller = "Account"})); 
    } 

    #endregion 
} 

回答

3

您可以继承RedirectToRouteResult类并为状态代码添加构造函数参数。

public class StatusRedirectResult : RedirectToRouteResult 

    private string _status; 

    public StatusRedirectResult(string action, RouteValueDictionary routeValues, string statusCode) 
    { 
     _status = statusCode; 
     base.RedirectToRouteResult(action, routeValues); 
    } 

    public override ExecuteResult(ControllerContext context) 
    { 
     context.HttpContext.Current.Response.Status = _status; 
     base.ExecuteResult(context); 
    } 
} 

要在控制器动作用这个,只是

return StatusRedirect("NewAction", new RouteValueDictionary(new { controller = "TheController" }, "410"); 
+0

我是在试图实现类似的东西中间,当我看到这个答案,尽管你的例子比较好。当使用RedirectToRoute时,“410”部分变得完全不必要,因此消除了StatusRedirectResult类。该属性本身可以执行重定向。我很快发布我的代码在我的问题的底部。 – 2009-09-08 21:14:41

0

它应该是两个一段代码。

在您的控制器

Response.StatusCode = (int)HttpStatusCode.NotFound; 

,那么你的自定义错误代码返回错误代码到所需的路线

<customErrors mode="On"> 
    <error statusCode="404" redirect="~/Profile/Update" /> 
</customErrors> 
+0

我尝试了这个想法,但没有成功。我没有真正尝试调试它以查明哪里出了什么问题(基本上浏览器什么都不显示)。 – 2009-09-08 21:11:19

相关问题