代码之家  ›  专栏  ›  技术社区  ›  Sailing Judo

ASP.NET MVC中是否有处理不同Response.StatusCode值的方法?

  •  3
  • Sailing Judo  · 技术社区  · 16 年前

    我想对其他响应代码执行类似的操作。例如,我有一个名为ActiveAccount的属性,它验证用户的帐户当前处于活动状态,然后允许他们访问控制器。如果它们不是活动的,我想将它们路由到特定的控制器和视图(以更新它们的帐户)。

    我想通过复制Authorize属性的方式来处理这个问题,并将StatusCode设置为类似410的值(警告:前面的数字是凭空提取的),并将用户路由到web.config文件中定义的位置。

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

    编辑:结果

    // 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
    }
    
    2 回复  |  直到 16 年前
        1
  •  3
  •   Tomas Aschan    16 年前

    你可以继承遗产 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");
    
        2
  •  0
  •   Jirapong    16 年前

    在控制器中,通过以下方式返回错误代码:

    Response.StatusCode = (int)HttpStatusCode.NotFound;
    

    然后将自定义错误代码添加到所需的路由

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