【问题标题】:Defining custom URL routes in ASP.Net MVC在 ASP.Net MVC 中定义自定义 URL 路由
【发布时间】:2011-05-05 20:58:03
【问题描述】:

我定义了以下路线:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(name: "Homepage", url: "", defaults: new { controller = "Restaurants", action = "Search" });
    routes.MapRoute(name: "About", url: "about", defaults: new { controller = "Home", action = "About" });
    routes.MapRoute(name: "Disclaimer", url: "disclaimer", defaults: new { controller = "Home", action = "Disclaimer" });
    routes.MapRoute(name: "Contact", url: "contact", defaults: new { controller = "Home", action = "Contact" });
    routes.MapRoute(name: "RestaurantDetails", url: "{id}/{slug}", defaults: new { controller = "Restaurant", action = "Details" });
    routes.MapRoute(name: "RestaurantLocationDetails", url: "{id}/{restaurantSlug}/{locationSlug}", defaults: new { controller = "Restaurant", action = "LocationDetails" });
    routes.MapRoute(name: "Api", url: "api/{action}", defaults: new { controller = "Api" });
}

我找到了一些给出 404 的路由,所以我安装了 RouteDebugger NuGet 包。

它显示了我对前 4 条路线的期望,但在最后 3 条路线上,我仍然得到 404 并且 Route Debugger 没有出现在页面底部 - 我希望它会告诉我哪些位得到了映射,但我什么也没得到。所有视图都存在。

所以我假设我在路线定义上犯了一个错误 - 任何人都可以对此有所了解吗?另外,如何让 Route Debugger 向我展示 URL 如何映射到那些返回 404 的页面的路由字典中?

【问题讨论】:

  • 我认为您需要颠倒您的 RestaurantDetails 和 RestaurantLocationDetails 定义,但我没有清醒,所以我可能是错的。而且我对路线一无所知。
  • +1 @Joe Phillips 承认你不清醒 :)
  • 如果您是盲人(我觉得这很神奇),您绝对应该在meta.stackoverflow.com 上提出您的问题以及您在访问本网站时遇到的问题。

标签: asp.net-mvc routes routedebugger


【解决方案1】:

您需要更改路线的顺序。

routes.MapRoute(name: "Homepage", url: "", defaults: new { controller = "Restaurants", action = "Search" });
routes.MapRoute(name: "About", url: "about", defaults: new { controller = "Home", action = "About" });
routes.MapRoute(name: "Disclaimer", url: "disclaimer", defaults: new { controller = "Home", action = "Disclaimer" });
routes.MapRoute(name: "Contact", url: "contact", defaults: new { controller = "Home", action = "Contact" });
routes.MapRoute(name: "Api", url: "api/{action}", defaults: new { controller = "Api" });
routes.MapRoute(name: "RestaurantLocationDetails", url: "{id}/{restaurantSlug}/{locationSlug}", defaults: new { controller = "Restaurant", action = "LocationDetails" });
routes.MapRoute(name: "RestaurantDetails", url: "{id}/{slug}", defaults: new { controller = "Restaurant", action = "Details" });

路由按照添加到路由列表的顺序进行处理。

例如:api/action 也匹配 RestaurantDetails 路由,因为路由 url 参数中只有两个参数。

所以它需要从具体到一般。通常,如果您在两个路由定义中具有相同数量的参数,则添加的第一个路由将是选择的那个。

【讨论】:

  • 虽然我认为 URL 的“api”部分不会与 RestaurantDetails URL 匹配吗?
  • 如果RestaurantDetailsApi 之前,它会匹配,因为api/action 也匹配{id}/{slug},所以如果RestaurantDetailsApi 之前,它将首先匹配。跨度>
  • 非常感谢您的详细解释。说得通。将 Api 放在 RestaurantDetails 之上,现在可以做到这一点。但我无法让 restaurantDetails 或 restaurantLocationDetails 工作 - 我尝试了不同的排序,并且还指定 "" 作为 id/slug/etc 的默认值。我还仔细检查了控制器/动作/参数是否与方法匹配。
  • 你能发布你的示例网址(没有域)。我用someid/somerestaurantslug/somelocationslug 对它们进行了测试,它匹配RestaurantLocationDetailsdetailid/detailslug 匹配RestaurantDetails 路由
  • 我想知道您是否希望 restaurantSlug 成为通配符匹配,以便您可以匹配 restid/restaurantslugpart1/restaurantslugpart2/locationslugpart1/locationslugpart2
猜你喜欢
  • 1970-01-01
  • 2011-04-02
  • 2020-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-01
相关资源
最近更新 更多