【问题标题】:In ASP.NET MVC4, how to redirect to {controller}/{id}?在 ASP.NET MVC4 中,如何重定向到 {controller}/{id}?
【发布时间】:2012-11-28 14:15:49
【问题描述】:

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

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

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

额外信息

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

【问题讨论】:

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


    【解决方案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】:

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

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

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

      【讨论】:

      • 我没有RedirectToRoute 方法。我很清楚我在AuthorizeAttribute 里面不是Controller 里面。无论如何,感谢您的时间和奉献精神。 :)
      【解决方案3】:

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

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

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

      【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 你是对的,我不是重定向到控制器/动作,而是重定向到控制器/ID(没有动作)。
      • 另外,我不能这样做,因为我没有 RedirectToRoute 方法,因为我在来自 AuthorizeAttribute 的派生类中。
      • @RubensMariuzzo 哦,很公平,现在我看到你的其他评论说同样的话!
      猜你喜欢
      • 2014-06-01
      • 1970-01-01
      • 2023-04-10
      • 2019-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多