2

Booking Controller有以下代码

public ActionResult Index(string id, string name)
{
    return View();
}

routeConfig有以下路线映射

public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
        routes.MapRoute(
            name: "Search",
            url: "{controller}/{location}/{checkIn}/{checkOut}/{no}",
            defaults: new { controller = "Search", action = "Index", location = UrlParameter.Optional, checkIn = UrlParameter.Optional, checkOut = UrlParameter.Optional, no = UrlParameter.Optional }
        );
        routes.MapRoute(
            name: "booking",
            url: "{controller}/{action}/{id}/{name}",
            defaults: new { controller = "Booking", action = "Index", id = UrlParameter.Optional, name=UrlParameter.Optional }
        );}

但是当我访问页面时,http://localhost:59041/booking/index/1/libin两个参数都返回null

4

1 回答 1

2

本书

随着您的应用程序变得越来越复杂,您可能会注册多个路由。当您这样做时,重要的是您要考虑注册它们的顺序。当路由引擎试图定位匹配的路由时,它只是简单地枚举路由集合,一旦找到匹配就停止枚举。

添加评论 如果您没有预料到,这可能会导致很多问题。让我们看一个可能存在问题的示例:

routes.MapRoute(
    >     "generic", // Route name
    >     "{site}", // URL with parameters
    >     new { controller = "SiteBuilder", action = "Index" } // Parameter defaults );
    > 
    > routes.MapRoute(
    >     "admin", // Route name
    >     "Admin", // URL with parameters
    >     new { controller = "Admin", action = "Index" } // Parameter defaults );

上面的代码片段注册了两条路线。第一条路线

包含单个占位符段并将控制器参数的默认值设置为 SiteBuilder。第二个路由包含一个常量段,并将控制器参数的默认值设置为 Admin。

这两个路由都是完全有效的,但是它们的映射顺序可能会导致意想不到的问题,因为第一个路由几乎匹配任何输入的值,这意味着它将是第一个匹配的

http://example.com/Admin并且由于路由引擎在找到第一个匹配项后停止,因此第二个路由将永远不会被使用。

因此,请务必牢记这种情况并考虑定义自定义路由的顺序。

您应该首先编写预订路线

  routes.MapRoute(
            name: "booking",
            url: "{controller}/{action}/{id}/{name}",
            defaults: new { controller = "Booking", action = "Index", id = UrlParameter.Optional, name=UrlParameter.Optional }
        );}
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
        routes.MapRoute(
            name: "Search",
            url: "{controller}/{location}/{checkIn}/{checkOut}/{no}",
            defaults: new { controller = "Search", action = "Index", location = UrlParameter.Optional, checkIn = UrlParameter.Optional, checkOut = UrlParameter.Optional, no = UrlParameter.Optional }
        );
于 2013-02-28T05:04:50.133 回答