2

我在 ASP.NET MVC4 项目中有以下路由配置:

routes.MapRoute(
  name:        "HttpError",
  url:         "{controller}/{id}",
  defaults:    new { controller = "Error", action = "Index" },
  constraints: new { id = @"\d+" }
);

现在,我想知道如何创建一个RedirectResultorRedirectToRouteResult来生成一个指向/Error/403而不是/Error/Index/403.

额外的信息

我正在尝试从其覆盖方法内部的自定义实现重定向未经授权的用户: .System.Web.Mvc.AuthorizeAttributeHandleUnauthorizedRequest(AuthorizationContext)

4

4 回答 4

1

在您的情况下使用它:

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
    filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary
                                                         {
                                                             {"action", "Index"},
                                                             {"controller", "Error"},
                                                             {"id", "403"},  
                                                         });
}

您必须考虑到您的路线必须放置在适当的位置 - 在更一般的路线之前,例如:

routes.MapRoute(
           name: "HttpError",
routes.MapRoute(
           name: "Default",

如果您颠倒顺序,MVC 将获取第一个适合的路由,并将您重定向到例如 /Error/Index/403而不是/Error/403.

于 2012-11-28T14:45:42.877 回答
1

Redirect to Route 允许您执行类似于以下的操作:

return RedirectToRoute("HttpError", new { controller = "Error", id = "401" }

它应该生成一个没有动作的链接。

于 2012-11-28T14:28:49.980 回答
0

您需要像这样更改 filterContext.Result (对于失败的授权)

 filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new  {  Controller = "SomeController", area = "MayBeSomeArea" }));

您应该在覆盖 HandleUnauthorizedRequest 方法的地方执行此操作AuthorizeAttribute

于 2012-11-28T14:37:47.943 回答
0

我不认为这正是你想要的,但对我来说,只返回这样的东西就足够了

return RedirectToRoute( new {controller = "controller_name", 
                             action = "action_name"});
于 2013-02-08T20:19:54.317 回答