2008-10-22 68 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中的工作方式,您將不得不在此處使用命名路由,而不是操作路由,因爲它「首次匹配」,而不是「最佳匹配」。

相關問題