2011-10-07 88 views
0

我已經寫了一段時間的博客作爲一個學習項目,並且我剛剛重寫了我的URL結構以改進我的控制器的組織。這個過程相當順利,但是我遇到了一個衝突路線的小問題。ASP.NET MVC 3:解決路由衝突

我想設置我的URL結構如下:

/ 
/page/2 
/category 
/category/page/2 

類別被存儲在數據庫中。目前這個工作正常,但我只注意到,當我嘗試鏈接回主頁時,它改爲打/page

這裏是我當前的路由表:

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

    routes.MapRoute(
     "Admin", 
     "admin", 
     new { controller = "Admin", action = "Index" } 
    ); 

    routes.MapRoute(
     "ShowPagedPostsByCategory", 
     "{category}/page/{page}", 
     new { controller = "Posts", action = "Index", page = UrlParameter.Optional }, 
     new { page = @"(\d+)?" } 
    ); 

    routes.MapRoute(
     "ShowPagedPosts", 
     "page/{page}", 
     new { controller = "Posts", action = "Index", page = UrlParameter.Optional }, 
     new { page = @"(\d+)?" } 
    ); 

    routes.MapRoute(
     "ShowPostsByCategory", 
     "{category}", 
     new { controller = "Posts", action = "Index" } 
    ); 

    routes.MapRoute(
     "ShowTaggedPosts", 
     "posts/tagged/{tag}", 
     new { controller = "Posts", action = "ShowTaggedPosts", tag = UrlParameter.Optional } 
    ); 

    routes.MapRoute(
     "EditDeleteComment", 
     "posts/{action}/{id}", 
     new { controller = "Posts" }, 
     new { action = @"EditComment|DeleteComment", id = @"\d+" } 
    ); 

    routes.MapRoute(
     "AddComment", 
     "{controller}/comment", 
     new { controller = "Posts", action = "Comment" } 
    ); 

    routes.MapRoute(
     "ShowPost", 
     "{controller}/{PostID}/{*slug}", 
     new { controller = "Posts", action = "ShowPost", slug = UrlParameter.Optional }, 
     new { PostID = @"\d+" } 
    ); 

    routes.MapRoute(
     "Default", 
     "{controller}/{action}/{id}", 
     new { controller = "Posts", action = "Index", id = UrlParameter.Optional } 
    ); 
} 

我能看到的問題是什麼:對家庭URL「/」與ShowPagedPosts路線匹配,但移動默認以下途徑似乎是錯誤的事情要做。這讓我覺得我對此的做法有些偏離。任何人都可以指出我正確的方向嗎?

編輯:其實,使用RouteDebugger,我可以看到它實際上與ShowPagedPosts ShowPostsByCategory路線匹配。

回答

2

使用Html.ActionLink時,將使用第一個匹配路徑。

如果要使用其他特定路由,請使用將路由名稱作爲參數的Html.RouteLink。

+0

感謝您的回覆。你的建議聽起來像我想要的,但我似乎無法得到它的工作。我在我的'/ admin'頁面上有一個鏈接,我想要進入主頁。我試過使用'@ Html.RouteLink(「Test」,「Default」)來匹配我的默認路由,但是雖然它呈現鏈接,但href是空白的,所以它只是再次回到'/ admin' 。我的參數與方法簽名相匹配,所以我不確定發生了什麼。 –

+0

好的,這似乎是'Html.RouteLink'(也是'Url.RouteUrl')的一個小問題。從Scott Gu的帖子[這裏]找到並解決了這個問題(http://weblogs.asp.net/scottgu/archive/2008/04/16/asp-net-mvc-source-refresh-preview.aspx)。感謝您的幫助,Arjan。 :) –