2008-10-22 127 views
8

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

这里是我的路线:

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 = ""}); 

现在的问题,当我通过看一个名为“标记的照片”由路径描述视图和执行的ActionLink只发生:

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

哪产生的网址:

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

从其他视图产生的URL是:

http://domain/group/GROUPNAME 

我已经拉下菲尔的ASP.NET Routing Debugger,一切都按顺序出现。这一个让我难住。有任何想法吗?

回答

3

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

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

新{sortBy =“”}

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

+0

啊,我忽略了在路由调试器中查询字符串URL正在执行第一个路由。在这种情况下,将SortBy =“”添加到第一个路由的默认值可以解决此问题,但是我不会遇到同样的问题如果稍后尝试按特定的事项进行排序?我只是删除第一条路线? – 2008-10-22 12:12:04

0

我认为它正在捡起你的第一条路线。它也有All的动作。而且由于没有指定sortby被它暴露出它作为查询字符串参数

这将仍在与PhotosController操作方法“所有的工作,因为它只是填充查询字符串值SortBy参数。

在路由调试器中是执行第3路还是第1路?

2

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

相关问题