Asp.net mvc 可以在自定义属性类中使用RedirectToAction()吗?

Asp.net mvc 可以在自定义属性类中使用RedirectToAction()吗?,asp.net-mvc,Asp.net Mvc,使用ASP.NETMVC2,是否有任何方法可以在基于AuthorizeAttribute类的类中使用该类的方法 public class CustomAttribute : AuthorizeAttribute { protected override bool AuthorizeCore(HttpContextBase context) { // Custom authentication goes here return false; }

使用ASP.NETMVC2,是否有任何方法可以在基于
AuthorizeAttribute
类的类中使用该类的方法

public class CustomAttribute : AuthorizeAttribute {
    protected override bool AuthorizeCore(HttpContextBase context) {
        // Custom authentication goes here
        return false;
    }

    public override void OnAuthorization(AuthorizationContext context) {
        base.OnAuthorization(context);

        // This would be my ideal result
        context.Result = RedirectToAction("Action", "Controller");
    }
}

我正在寻找一种方法,当用户身份验证失败时,将用户重新定向到特定的控制器/操作,而不是返回登录页面。是否可以为该控制器/操作生成重新定向URL,然后使用?我试图避免对URL进行硬编码的诱惑。

您可以这样做:

var routeValues = new RouteValueDictionary();
routeValues["controller"] = "ControllerName";
routeValues["action"] = "ActionName";
//Other route values if needed.
context.Result = new RedirectToRouteResult(routeValues);

当您在控制器中调用“RedirectToAction()”时,框架就是这样做的。

您可以/应该覆盖
HandleUnauthorizedRequest
,而不是
授权
。以下是默认实现:

    protected virtual void HandleUnauthorizedRequest(AuthorizationContext filterContext) {
        // Returns HTTP 401 - see comment in HttpUnauthorizedResult.cs.
        filterContext.Result = new HttpUnauthorizedResult();
    }
您不能使用
控制器.重定向到操作
,但可以返回新的
重定向到路由结果

因此,您可以:

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) {
        // Returns HTTP 401 - see comment in HttpUnauthorizedResult.cs.
        filterContext.Result = new RedirectToRouteResult(
                                   new RouteValueDictionary 
                                   {
                                       { "action", "ActionName" },
                                       { "controller", "ControllerName" }
                                   });
    }

以防其他人对这个问题感兴趣。 这可以用一种更简单的方法解决(至少使用MVC 3,不知道MVC 2):

只需在自定义属性中创建一个小型专用控制器:

    private class RedirectController : Controller
    {
        public ActionResult RedirectWhereever()
        {
            return RedirectToAction("Action", "Controller");
        }

    }
这可以很容易地用于您的HandleUnauthorizedRequest方法(参见Craigs答案):


谢谢,行得通。使用HandleUnauthorizedRequest有一个很好的窍门——我之所以使用OnAuthorization,是因为我在另一个教程/讨论中看到了它(他们有一个自定义属性,当身份验证失败时设置该属性,将触发重新定向).@LanceMcNearney我会在参数filterContext中传递什么?@Craig Stuntz我会在filterContext中传递什么?@Pomster:你不会传递任何东西。MVC会为您传递这些信息。一般来说,不要直接调用它。你已经在全能的真主的恩典下创造了我的一天。
RedirectToAction
返回一个
RedirectToRouteResult
,没有必要创建一个控制器来返回一个,正如@Craig Stuntz回答的那样什么是上下文?我有红色下划线?@Pomster检查问题,“上下文”是问题所涉及的方法的一个参数。谢谢,要让它工作,需要传递什么?Iv一直在努力获取此工作这是一个操作筛选器属性,需要添加到控制器、操作或注册为全局筛选器。
filterContext.Result = (new RedirectController()).RedirectWhereever();