2013-02-28 65 views
3

Booking Controller有以下代码MVC4 RouteConfig PARAMS返回NULL

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的页面都PARAMS回报null

+0

写预订路线贵的Request.QueryString有什么价值? – 2013-02-28 05:02:38

+0

您的示例将您的ID显示为整数(1),但您的路由是字符串。部分问题是2个可选的字符串参数。您是否将Id更改为整数? – 2013-02-28 05:07:17

+0

aaaaah,@MarkOreta,这就是为什么shaharoozi的回答是正确的。这就是我错过的! – 2013-02-28 05:09:48

回答

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

你说得对,这条路线应该是第一条。但是为什么默认路由会失败。我甚至没有注意到正确的路线B/C我认为该网址是为默认的一个。 – 2013-02-28 05:08:37

+0

现在我看到,int将无法匹配,并且默认路由将失败。 – 2013-02-28 05:10:38

+0

路线。MapRoute( name:“Default”, url:“{controller}/{action}/{id}/{Name}”, 默认值:new {controller =“Home”,action =“Index”,id = UrlParameter .Optional,name = UrlParameter.Optional} ); – 2013-02-28 05:12:34