【问题标题】:ASP.NET MVC 3: Solving a route conflictASP.NET MVC 3:解决路由冲突
【发布时间】:2011-12-03 08:30:13
【问题描述】:

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

我正在尝试如下设置我的 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 路由匹配。

【问题讨论】:

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


    【解决方案1】:

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

    如果你想使用另一个特定的路由,请使用 Html.RouteLink,它将路由的名称作为参数。

    【讨论】:

    • 感谢您的回复。你的建议听起来像我想要的,但我似乎无法让它发挥作用。我的/admin 页面上有一个链接,我想转到主页。我尝试使用@Html.RouteLink("Test", "Default") 来匹配我的默认路由,但是虽然它正在呈现链接,但href 是空白的,所以它只是让我再次回到/admin。我的参数与方法签名匹配,所以我不确定发生了什么。
    • 好的,Html.RouteLink(还有Url.RouteUrl)似乎是个小问题。从 Scott Gu 的帖子here 中找到并解决了该问题。感谢您的帮助,阿扬。 :)
    猜你喜欢
    • 1970-01-01
    • 2016-04-17
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多