ASP.NET MVC 3:解决路由冲突

时间:2011-10-07 22:27:19

标签: c# asp.net-mvc-3 conflict routes

我一直在写博客作为学习项目已有一段时间了,我刚刚重写了我的网址结构,以改善我的控制器的组织。这已经相当顺利,但我对一条相互冲突的路线有一点问题。

我正在尝试按以下方式设置我的网址结构:

/
/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路线匹配。

1 个答案:

答案 0 :(得分:2)

使用Html.ActionLink时,将使用第一个匹配路线。

如果您想使用其他特定路线,请使用Html.RouteLink,它将路线名称作为参数。