2011-10-07 91 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。 :) –