在ASP.NET MVC4中,如何重定向到{controller} / {id}?

时间:2012-11-28 14:15:50

标签: c# asp.net-mvc-4 url-routing authorize-attribute

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

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

现在,我想知道如何创建生成指向RedirectResult而不是RedirectToRouteResult的网址的/Error/403/Error/Index/403

额外信息

我正在尝试将未经授权的用户从其重写方法System.Web.Mvc.AuthorizeAttribute内的HandleUnauthorizedRequest(AuthorizationContext)的自定义实现中重定向。

4 个答案:

答案 0 :(得分:1)

重定向到路线允许您执行类似以下操作:

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

应生成没有操作的链接。

答案 1 :(得分: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

答案 2 :(得分:0)

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

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

您应该在覆盖AuthorizeAttribute

的HandleUnauthorizedRequest方法的地方执行此操作

答案 3 :(得分:0)

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

return RedirectToRoute( new {controller = "controller_name", 
                             action = "action_name"});