2010-08-17 40 views
0

在我的Global.asax文件中,我有以下内容;MVC:这个路由有什么问题?

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" }); 

     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { controller = "Account", action = "LogOn", id = UrlParameter.Optional }); // Parameter defaults 

     routes.MapRoute(
      "Contracts", 
      "Contract/{contractId}", 
      new { controller = "Contract", action = "Details" } 
      ); 

我想指定一个路径Contract/10,其中10是contractId,它是我的ContractController中Detail方法的参数。 所以这个工作; http://localhost:1234/Contract/Details?contractId=10 但不是 http://localhost:1234/Contract/10

我在做什么错?

回答

2

变化

routes.MapRoute(
      "Contracts", 
      "Contract/{contractId}", 
      new { controller = "Contract", action = "Details" } 
      ); 

或 ”合同“ 图路线,经过” 行动= “详细资料” 放为了

routes.MapRoute(
      "Contracts", 
      "Contract/{action}/{contractId}", 
      new { controller = "Contract", action = "Details" } 
      ); 

并把它的默认路由前

+0

工作,谢谢。这确实意味着“详细信息”必须位于路径名中。我对自己的工作很满意,但对于我自己的教育,我想我想知道如何从路径和工作中排除“细节”。 – arame3333 2010-08-17 15:48:37

+0

对于教育,然后;)如果你想从路径中排除细节,你可以使它成为Contract/{contractId}(你以前的方式),但保持默认action =“details”(以前的方式)。这是令你失望的命令 – BritishDeveloper 2010-08-17 16:04:11

2

将“默认”路线放在“合同”路线后面,并且一切顺利。

路由表从上到下找到第一个匹配,然后停止查找。考虑到这一点始终把上面的更一般的人更具体的路线

routes.MapRoute(
     "Contracts", 
     "Contract/{contractId}", 
     new { controller = "Contract", action = "Details", contractId = UrlParameter.Optional } 
     ); 

    routes.MapRoute(
     "Default", // Route name 
     "{controller}/{action}/{id}", // URL with parameters 
     new { controller = "Account", action = "LogOn", id = UrlParameter.Optional }); // Parameter defaults 

然后确保你ContractController接受一个名为contractId参数的详细操作方法。

+0

似乎并非是答案后,我登录我浏览这个页面; HTTP://禄alhost:4275 /合同/列表,但现在已经过时了。 – arame3333 2010-08-17 15:36:20

+0

这是因为您的合同路线中没有行动参数。当你将它移动到默认值时,它现在捕获你所评论的链接,但List不是有效的合同ID(我认为它是一个Int)。 – Tommy 2010-08-17 15:42:13

+0

我很欣赏你的建议。 – arame3333 2010-08-17 15:49:11

0

你是说输入“http://localhost:1234/Contract/Details?contractID=10”确实有效,“http://locatlhost:1234/Contract/10”不起作用?你有没有试过:“http://localhost:1234/Contract/Details/10”? “:”,contractId = UrlParameter.Optional这样一来,它看起来像这样

routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.MapRoute( 
     "Default", // Route name 
     "{controller}/{action}/{id}", // URL with parameters 
     new { controller = "Account", action = "LogOn", id = UrlParameter.Optional }); // Parameter defaults 

    routes.MapRoute( 
     "Contracts", 
     "Contract/{contractId}", 
     new { controller = "Contract", action = "Details", contractId = UrlParameter.Optional } 
     );