【问题标题】:Custom IRouteHandler route screws up MVC link building自定义 IRouteHandler 路由搞砸了 MVC 链接构建
【发布时间】:2010-12-04 01:31:54
【问题描述】:

我在 ASP.NET MVC2 中有一个自定义路由处理程序来捕获前缀路径中的所有 url,如下所示:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.Add(new Route("@api/{*all}", new ApiHandler()));
routes.MapRoute(
  "Default", // Route name
  "{controller}/{action}/{id}", // URL with parameters
  new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);

路由工作正常,但如果我使用 Html.Actionlink 或从控制器返回 ReturnToAction(),则构建的 uri 会创建一个损坏的 uri,如下所示:

/@api?action=Add&controller=Home

而不是

/Home/Add

如何影响 uri 构建逻辑以考虑默认路由模式?

【问题讨论】:

    标签: asp.net-mvc-2 iroutehandler


    【解决方案1】:

    我想出了一个技巧来阻止所描述的行为。虽然这“解决”了问题,但它确实有点讨厌,我更喜欢一种更简洁的方法来从虚拟路径构建逻辑中排除路由

    routes.Add(
      new Route("@api/{*all}",
      // A random and unlikely controller name as the default
      new RouteValueDictionary() { { "controller", "qwewqewqeqweq" } },
      // and a constraint requiring any controller to be that random, default value
      new RouteValueDictionary() { { "controller", "qwewqewqeqweq" } }, 
      new ApiHandler()
    );
    

    这意味着只有当有问题的控制器是“qwewqewqeqweq”时,才会为虚拟路径构建选择路由,希望这不太可能。我说这很讨厌。

    【讨论】:

      【解决方案2】:

      您可以使用 RouteLink 帮助器指定路线的名称:

      <%: Html.RouteLink("link text", "Default", 
          new { action = "add", controller = "home" }) %>
      

      【讨论】:

      • 我不想把负担推到我想建立的每个链接上,因为我有一条错误地篡夺了正确路线的路线。
      猜你喜欢
      • 1970-01-01
      • 2015-07-17
      • 1970-01-01
      • 1970-01-01
      • 2016-10-17
      • 1970-01-01
      • 2023-03-02
      • 1970-01-01
      • 2013-06-16
      相关资源
      最近更新 更多