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

时间:2011-06-08 07:43:58

标签: c# asp.net-mvc-3

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

@{
    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
…

现在,如果我按照路线的顺序进行交换,它会按照我的要求生成链接,但后来又遇到了另一个问题。如果我然后导航到/ artists / a(或任何其他字母),列表中的第一个链接将获取字母参数的当前值并将其附加到列表中,因此我最终得到如下链接:

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

正如您所看到的,这使得无法在没有过滤的情况下返回索引。有关如何修复路由以便正确创建链接而不将参数作为查询字符串传递,或修复ActionLink以不附加当前参数的任何想法?

1 个答案:

答案 0 :(得分: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"} );