2011-06-08 33 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

相关问题