在我开发的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

我已经删除了Phil的 ASP.NET路由调试器,一切都按顺序显示。这个让我难过。有什么想法吗?

有帮助吗?

解决方案

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

但你可以通过为第一条路线分配一个默认值来摆脱那种sortBy param。

new {sortBy =&quot;&quot; }

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

其他提示

你将不得不在这里使用命名路由,而不是动作路由,因为路由在ASP.NET中的工作方式,因为它确实“首先匹配”,而不是“最佳匹配”。

我认为这是你的第一条路线。它也有动作All。并且因为未指定sortby,所以它将它作为查询字符串参数公开

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top