2013-10-24 52 views
0

我正在使用ASP.net MVC4與VWD Express 2010.我已經設置了一個額外路由,以從URL刪除多餘的/Home/,如herehere 。我確信把他們在正確的順序:404設置非默認ASP.net MVC路由後

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

     routes.MapRoute(
      name: "Home", 
      url: "{action}", 
      defaults: new { controller = "Home", action = "Index" } 
     ); 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 
    } 

以此爲據可以作爲消除/Home/而言的,但現在我得到404試圖訪問非默認控制器時:

Server Error in '/' Application. 

The resource cannot be found. 

Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable. Please review the following URL and make sure that it is spelled correctly. 

Requested URL: /LogItem/ 

我已經追蹤到路線,因爲如果我刪除非默認的,它再次正常工作。我不知道我做錯了什麼,但通過我對其他答案和文檔的理解,這應該起作用。

編輯:由於它顯然沒有從我的描述清楚,我添加了「家」的路線,能夠鏈接到/About/而不是/Home/About,等有人建議的解決方案,我在Google上搜尋後發現的。我基本上希望它匹配HomeController用速記的URL(/{action})實施的行動,以及任何其他控制器我還加全(/{controller}/{action}/{optional id}

回答

0

路由是一種先到先得的基礎上進行評估。你的「主頁」路線基本上是這樣說的:「如果你看到的網址只有一個段 - 抓住它並處理它,那麼就假設該段是行動。當發生這種情況時,你註冊的第二條路線沒有機會處理請求

以特定的錯誤爲例,您正在請求「/ LogItem」.Home路由啓動,解析「LogItem」作爲操作的名稱,並將其傳遞給默認控制器。該控制器可能沒有登錄操作,404被拋出

一個解決方案是改變路由的順序,但即使如此,這兩個是重疊的,因爲第二個也將處理1段的URL ,但將該段解釋爲控制器,它將執行默認操作(Index)而不是傳遞處理到下一條路線。

爲什麼你需要第一條路線?你想達到什麼目的?如果您提供更多的上下文,我們可以找出實現這些路線的方法。

+0

我在我的文章的解釋中編輯。 – mathrick

+0

我不認爲您可以同時擁有/ {action}以及/ {controller}/{action}路線。不管他們的命令是什麼,第一個總是會處理請求,並阻止對方這樣做。您可以爲所需的每個特定頁面(即/ About,/ Contact等)創建單獨的路線,而不是/ {action}。這會將處理傳遞給下一個路由,除非它是這些URL中的一個。 – Slavo

+0

很遺憾。我認爲匹配會考慮到每個控制器中實施的操作,而我鏈接的其他答案肯定會讓我相信這種方法行得通。 – mathrick