我得到了以下代码(从局部视图),它创建了一个链接列表,使我能够根据索引页中列出的项目的开头字母过滤它们:
@{
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文件中设置了以下路由:
routes.MapRoute(
"",
"artists",
new { controller = "Artist", action = "Index" }
);
routes.MapRoute(
"",
"artists/{letter}",
new { controller = "Artist", action = "Index" },
new { letter = "[a-z]" }
);
因此,上面的部分视图创建的链接的路径应该看起来像:
/artists
/artists/a
/artists/b
…
等等。不过,我得到的奇怪之处在于,它忽略了路由并创建了类似的链接
/artists
/artists?letter=a
/artists?letter=b
…
现在,如果我交换路由的顺序,它会生成我想要的链接,但随后我遇到了另一个问题。如果我导航到/aartists/a(或任何其他字母),列表中的第一个链接会获取字母参数的当前值并将其附加到列表中,因此我最终会得到以下链接:
/artists/a
/artists/a
/artists/b
…
正如您所看到的,这使得不可能在不进行筛选的情况下返回到索引。关于如何修复路由以正确创建链接而不将参数作为查询字符串传递,或者修复ActionLink以不附加当前参数,有什么想法吗?
只生成一条路由,并将
{letter}
参数设置为可选。
routes.MapRoute(
"artists",
"artists/{letter}",
new { controller = "Artist", action = "Index", letter = UrlParameter.Optional },
new { letter = "[a-z]" }
);
编辑:
看看这篇文章。
第2版:
另一种可能的解决方案是:
routes.MapRoute(
"artists",
"artists/{letter}",
new { controller = "Artist", action = "Index", letter = "0" },
new { letter = "[0a-z]" }
);
@Html.ActionLink("0–9", "Index", new { letter = "0"} );