C# 为什么在我的ASP.NET MVC路由中使用查询字符串?

C# 为什么在我的ASP.NET MVC路由中使用查询字符串?,c#,asp.net,asp.net-mvc,routing,C#,Asp.net,Asp.net Mvc,Routing,在我正在开发的ASP.NET MVC(Beta版)网站上,有时对ActionLink的调用会返回包含查询字符串的URL。我已经隔离了产生这种行为的环境,但是我仍然不明白为什么它没有生成干净的URL,而是决定使用查询字符串参数。我知道它们在功能上是相同的,但对于URL的一致性(和外观),这不是我想要的 以下是我的路线: routes.MapRoute( "Photo Gallery Shortcut", "group/{groupname}", new { controll

在我正在开发的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 = ""});
从任何其他视图中,生成的URL为:

http://domain/group/GROUPNAME

我拆下了菲尔的,一切都井然有序。这件事把我难住了。有什么想法吗?

我想这是你的第一条路线。它也有所有的行动。由于未指定sortby,因此它将其作为querystring参数公开

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


在路由调试器中,它是执行第三个路由还是第一个路由?

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

但是您可以通过为第一条路由指定默认值来摆脱sortBy参数

新的{sortBy=”“}


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

您必须在此处使用命名路由,而不是操作路由,因为在ASP.NET中路由的工作方式是“第一次匹配”,而不是“最佳匹配”。

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