MVC4 RouteConfig参数返回null

时间:2013-02-28 04:52:49

标签: c# asp.net-mvc

我的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

1 个答案:

答案 0 :(得分:2)

  

请参阅this本书

     

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

     

添加评论如果不是,这可能会导致很多问题   期待它。让我们看看这可能是一个问题的例子:

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 }
        );