【问题标题】:Routing & URL generation issue with optional parameters带有可选参数的路由和 URL 生成问题
【发布时间】:2010-06-07 12:06:49
【问题描述】:

我对 ASP.NET MVC 2 下的 URL 生成和路由有一个小问题。我的路由有可选参数,如果指定了参数,则 URL 会正确生成。

因此:

routes.MapRoute("Blog", "Articles/{tag}/{page}", new { controller = "Blog", action = "Index" });

与:

<%: Html.ActionLink(item.Tag, "Index", "Blog", new { tag = item.Tag }, null) %>

正确生成~/Articles/item_tag/1。该链接有效,我的视图已呈现。

我有其他链接,例如:

<%: Html.ActionLink("See more articles", "Index", "Blog") %>

生成~/Blog 而不是~/Articles

如果我添加第二条路线,例如:

routes.MapRoute("Blog2", "Articles", new { controller = "Blog", action = "Index" });

我的网址已正确呈现。我不明白为什么我需要添加第二条路线,因为它看起来非常多余,因为第一条路线有可选的路段。

任何帮助表示赞赏。

法比安

编辑:添加路线代码。

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

// Home
routes.MapRoute("Home", "", new { controller = "Home", action = "Index" });
routes.MapRoute("HomeSearch", "Search", new { controller = "Home", action = "Search" });

// Solutions
routes.MapRoute("Solutions", "Solutions", new { controller = "Home", action = "Solutions" });

// Customers
routes.MapRoute("Customers", "Customers", new { controller = "Home", action = "Customers" });

// News
routes.MapRoute("NewsDetails", "News/Details/{id}", new { controller = "News", action = "Details" });
routes.MapRoute("News", "News", new { controller = "News", action = "Index" });

// Articles
routes.MapRoute("BlogDetails", "Articles/Details/{id}", new { controller = "Blog", action = "Details" });
routes.MapRoute("BlogWithTag", "Articles/{tag}/{page}", new { controller = "Blog", action = "Index", tag = "", page = 1 });
routes.MapRoute("Blog", "Articles/{page}", new { controller = "Blog", action = "Index", page = 1 });

// Contact
routes.MapRoute("Contact", "Contact", new { controller = "Contact", action = "Create" });

// Sitemap
routes.MapRoute("Sitemap", "SiteMap", new { controller = "Home", action = "SiteMap" });

【问题讨论】:

    标签: asp.net-mvc url routing


    【解决方案1】:

    非可选参数是强制性的

    顾名思义,它们是非可选的。因此,如果您在 ActionLink() 调用中未提供 tagpage,则路由不会命中此路由定义。

    因此,当您调用 Html.ActionLink() 并提供 tag 参数 但不是 page 时,您的示例我想您也必须具有以 Article/... 开头的不同路由定义,因为您的您在此处提供的路线无法生成您的链接:

    /Articles/item_tag/1
    

    Route 对参数类型一无所知。这意味着参数page 的值是通过其他方式提供的:

    • 现有页面路由数据值
    • 不同的路由定义

    那么它对你有什么好处?

    在您的情况下,重要的是在生成链接时不提供tagpage 参数值,您的路由定义不会受到影响,并且您的链接将不正确。

    为什么你实际上得到了/Blog 链接?仅仅因为你最后可能还有默认的路由定义:

    {controller}/{action}/{id}
    

    而且由于您确实说过控制器是 Blog 并且操作是 Index 但没有提供 Id,所以它将使用其默认值,这将生成您的默认链接URL 正好是/blog。这样看就很明显了吧?

    【讨论】:

    • 谢谢,我认为让我的控制器方法带有可选参数就足够了。我已经像这样修改了我的 Global.asax.cs 文件: routes.MapRoute("Blog", "Articles/{tag}/{page}", new { controller = "Blog", action = "Index", tag = "", 页 = 1 });但它仍然没有生成正确的 URL。
    • @Fabian Vilers:如果您提供来自 Global.ascx.cs 的完整路线定义(将其添加到您的问题并格式化),我们将能够提供帮助。 为什么? 仅仅因为它应该使用一个定义tagpage 的默认值的路由。如果这两个参数有默认值,则不需要第二个路由定义。
    【解决方案2】:

    在这个:

    routes.MapRoute("Blog", "Articles/{tag}/{page}", new { controller = "Blog", action = "Index" });
    

    {tag}{page} 标记不是可选的。它们被硬编码到 URI 中,您没有它们的默认值。

    由于路由中{tag}{page} 之间的/,这将永远不会生成像~/Blog 这样的URI。

    【讨论】:

    • 如果有另一个以"Blog/..."开头的路由定义
    • 所以你的建议是保留我的“Blog2”路线?
    • 是的,可能。如果不制定完整的路由策略,很难确定。顺便说一句,你应该这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多