【问题标题】:Why the query strings in my ASP.NET MVC route?为什么我的 ASP.NET MVC 路由中有查询字符串?
【发布时间】:2010-09-18 11:27:56
【问题描述】:

在我正在开发的 ASP.NET MVC (Beta) 站点上,有时对 ActionLink 的调用会返回给我包含查询字符串的 URL。我已经隔离了产生这种行为的情况,但我仍然不明白为什么它决定使用查询字符串参数,而不是产生一个干净的 URL。我知道它们在功能上是相同的,但是为了 URL 的一致性(和外观),这不是我想要的。

这是我的路线:

routes.MapRoute(
    "Photo Gallery Shortcut",
    "group/{groupname}",
    new { controller = "Photos", action = "All", Id = "" });

routes.MapRoute(
    "Tagged Photos", //since the Tagged action takes an extra parameter, put it first
    "group/{groupname}/Photos/Tagged/{tagname}/{sortby}",
    new { controller = "Photos", action = "Tagged", Id = "", SortBy = "" });

routes.MapRoute(
    "Photo Gallery", //since the Gallery's defualt action is "All" not "Index" its listed seperatly
    "group/{groupname}/Photos/{action}/{sortby}",
    new { controller = "Photos", action = "All", Id = "", SortBy = "" });

routes.MapRoute(
    "Group",  //<-- "Group" Category defined above
    "group/{groupname}/{controller}/{action}/{id}",
    new {controller = "Photos", action = "Index", Id = ""});

现在只有当我查看名为“Tagged Photos”的路线描述的视图并通过以下方式执行 ActionLink 时才会出现问题:

Html.ActionLink<PhotosController>(p => p.All((string)ViewData["group"], ""), "Home")

生成 URL:

http://domain/group/GROUPNAME?sortBy=

从任何其他视图生成的 URL 是:

http://domain/group/GROUPNAME

我已经拉下了菲尔的ASP.NET Routing Debugger,一切都按顺序显示了。这个让我难住了。有什么想法吗?

【问题讨论】:

    标签: c# asp.net asp.net-mvc routing


    【解决方案1】:

    不确定为什么不同的视图会产生不同的 URL。

    但是您可以通过为第一个路由分配一个默认值来摆脱该 sortBy 参数。

    新的 { sortBy = "" }

    在生成过程中,如果 sortBy 匹配默认值,路由引擎将跳过该参数(如果它在查询字符串中)。

    【讨论】:

    • 啊,我忽略了在路由调试器中查询字符串 URL 正在执行第一个路由。在这种情况下,将 SortBy = "" 添加到第一条路由的默认值可以解决它,但是如果我稍后尝试按特定内容进行排序,我不会遇到同样的问题吗?我只是删除第一条路线吗?
    • 当您指定另一个 sortBy 值时,将添加 sortBy=blah 查询字符串参数。
    【解决方案2】:

    您将不得不在这里使用命名路由,而不是操作路由,因为路由在 ASP.NET 中的工作方式,因为它是“第一次匹配”,而不是“最佳匹配”。

    【讨论】:

      【解决方案3】:

      我认为它正在选择您的第一条路线。它也有动作 All。并且由于未指定 sortby,因此将其公开为查询字符串参数

      这仍然适用于 PhotosController 上的操作方法“All”,因为它只是用查询字符串值填充 sortby 参数。

      在 Route Debugger 中是执行第 3 条路线还是第 1 条路线?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-06
        • 1970-01-01
        • 2012-04-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-28
        • 2011-10-19
        • 1970-01-01
        相关资源
        最近更新 更多