Asp.net mvc 可以在自定义属性类中使用RedirectToAction()吗?
使用ASP.NETMVC2,是否有任何方法可以在基于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; }
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();