Html.ActionLink创建包含当前页面中参数的链接

本文关键字:参数 链接 当前页 ActionLink 创建 包含 Html | 更新日期: 2023-09-27 17:58:33

我得到了以下代码(从局部视图),它创建了一个链接列表,使我能够根据索引页中列出的项目的开头字母过滤它们:

@{
    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以不附加当前参数,有什么想法吗?

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