2011-06-08 38 views
1

我有以下代碼(來自局部視圖),它創建了一個鏈接列表,使我能夠根據它們開始的字母來過濾列在我的索引頁中的項目搭配:Html.ActionLink創建包含當前頁面參數的鏈接

@{ 
    string letters = "abcdefghijklmnopqrstuvwxyz"; 
} 
<ul> 
    <li>@Html.ActionLink("0–9", "Index")</li> 
    @foreach (char c in letters.ToCharArray()) { 
     <li>@Html.ActionLink(c.ToString().ToUpper(), "Index", new { letter = c.ToString() })</li> 
    } 
</ul> 

列表中的第一個環節是哪裏的項目以數字開頭的情況。我也有我的Global.asax文件中設置以下路線:

/artists 
/artists/a 
/artists/b 
… 

等:

routes.MapRoute(
    "", 
    "artists", 
    new { controller = "Artist", action = "Index" } 
); 

routes.MapRoute(
    "", 
    "artists/{letter}", 
    new { controller = "Artist", action = "Index" }, 
    new { letter = "[a-z]" } 
); 

所以對於上述局部視圖創建應該是這個樣子的鏈接路徑上。在它忽視了路由和創建類似鏈接什麼我越來越雖然是奇:現在

/artists 
/artists?letter=a 
/artists?letter=b 
… 

,如果我周圍的路線的順序調換,它產生的聯繫,因爲我想他們,但後來我遇到另一個問題。如果我然後導航到/ artists/a(或任何其他字母),列表中的第一個鏈接將拾取字母參數的當前值並將其附加到列表中,所以我最終得到如下鏈接:

/artists/a 
/artists/a 
/artists/b 
… 

正如你所看到的,這使得它不可能要回,沒有過濾索引。任何想法,我怎麼可以修復路由,這樣的鏈接正確創建無參數作爲查詢字符串傳遞,或修復ActionLink的,以不追加當前參數?

回答

1

做只有一個路由,並設置 {letter}參數可選。

routes.MapRoute(
    "artists", 
    "artists/{letter}", 
    new { controller = "Artist", action = "Index", letter = UrlParameter.Optional }, 
    new { letter = "[a-z]" } 
); 

編輯:

看一看this post

EDIT2:

另一種可能的解決辦法是:

routes.MapRoute(
    "artists", 
    "artists/{letter}", 
    new { controller = "Artist", action = "Index", letter = "0" }, 
    new { letter = "[0a-z]" } 
); 

@Html.ActionLink("0–9", "Index", new { letter = "0"}); 
+0

感謝。我已經嘗試過,但路由「/ artists」未匹配,因爲字母參數的約束意味着路由不匹配。如果我將其更改爲[a-z]?它匹配,但接下來我遇到了第一條路線拾取字母參數的當前值相同的問題。 – 2011-06-08 08:06:58

+0

儘量使約束'([A-Z])?'允許空值。 – DanielB 2011-06-08 08:12:03

+0

@DanielB,我也試過了。然後,它會正確匹配「/ artists」路線,但會創建鏈接,將參數附加爲查詢字符串,而不是像「/ artists/a」一樣。 – 2011-06-08 08:29:54

相關問題