2012-06-18 50 views
2

我有一個失控的請求控制器,我想在保持一個乾淨的URL的同時在多個控制器上劃分動作。我試圖嘗試路由,但沒有成功。我已經閱讀了關於路由的一些示例和教程,但是雖然我理解了這些示例,但似乎沒有什麼適用於我的案例,並且我覺得並不聰明。我想要的是在我的ApprovalController而不是我的RequestController上處理URL Requests/Approval,所以我編寫了以下內容。MVC路由與部分類

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

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

     routes.MapRoute(
      "Approval", 
      "Request/{controller}/{action}", 
      new { controller = "Approval", action="Index", id = "" } 
     ); 

    } 

但它不工作。爲什麼?我的視圖中有一個名爲Approval的文件夾,並且在那裏有一個名爲Index.cshtml的文件。我應該如何編碼MapRoute?

編輯

我說我有

+2

您能否顯示您映射其他路線的順序?這可能是另一條路線匹配相同的請求。 – awbergs

+0

我只有標準的「開箱」路線,否則。我更新了問題,以便您可以看到「RegisterRoutes」功能。 –

+0

有關路由的一件事要記住,路由是按順序進行評估的,只要路由匹配,就是使用的路由,因此首先會導致它不再進一步查看。您可以通過名稱來指定路線,在這種情況下是「批准」 – Brian

回答

5

所有的路由需要交換兩個圖路線語句,就像這樣:

routes.MapRoute(
    "Approval", 
    "Request/Approval/{action}", 
    new { controller = "Approval", action="Index", id = "" } 
); 

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

原因是目前沒有工作是因爲第一個語句('Default'路由名稱)在第二個語句被評估之前得到匹配。您需要刪除批准路徑中的「{controller}」並替換爲「批准」...除非您特別需要URL /請求/ {任意控制器}/{動作}通過,我懷疑。從您的問題看來,您似乎只需要/請求/批准/即可轉至您的審批控制器。

不要忘記將Default路徑保留在底部,以便與您的其他控制器和操作相匹配。如果沒有其他比賽存在,它可以作爲一個通用的。

+0

這樣做的竅門。我認爲這是因爲我在這兩個URL中都有相同數量的參數,但是在我被告知該文件不存在之前,它如何不繼續尋找替代路線? –

+0

與此有關。現在,如果您嘗試在RequestController上調用一個操作,MVC將查找與該操作同名的控制器。 –

+0

@KyleTrauberman你是對的,我剛剛發佈了關於此的編輯警告 – Joshua

1

您映射路線的順序非常重要。在默認路線之前移動第二條路線。

儘管如此,您仍然會遇到問題,因爲任何東西/request/something都會尋找SomethingContoller。要解決此問題,請將您的路線更改爲:

routes.MapRoute(
     "Approval", 
     "Request/Approval/{action}", 
     new { controller = "Approval", action="Index", id = "" } 
    ); 
+0

感謝您的輸入。這實際上是我的第一個方法,但它不起作用。我嘗試了@joshuam的建議,並且這個技巧。 –