2010-08-17 83 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 } 
     );