ASP.NET核心MVC:Razor页面路由,错误地重新使用了以前的路由数据



我正在使用RazorPages开发一个dotnet 6 mvc应用程序,但我遇到了一个奇怪的路由行为问题。

我有一个RazorPage/Pages/News.cshtml

使用默认路线/新闻可访问此页面

当在没有任何参数的情况下调用时,此页面将显示新闻文章的索引。

我还希望这个页面能够通过这样的路径显示特定的新闻文章。。。

/新闻/1234我的新闻文章

为了实现这一点,我添加了一个配置,比如…

builder.Services.AddRazorPages(options =>
{
options.Conventions.AddPageRoute("/News", "News/{id:regex(^\d+\-.*)?}");
});

在我的模板中,我可以使用这样的链接。。。

<a asp-page="/News" asp-all-route-data="@(new Dictionary<string, string> { { "id", "1234-my-news-article" } })">My News Article</a>

<a asp-page="/News">All Articles</a>

然而,一旦我导航到一篇特定的文章,索引链接就不会正确呈现,而是会再次链接到同一篇文章。它似乎正在重新使用当前的路由参数。

有什么办法可以避免这种情况吗?

更新:

我找到了一个变通办法,如果我用这个标签代替。。。

<a asp-page="/News" asp-route-id="">All Articles</a>

则它将正确地链接到"0"/新闻";。

必须明确地将其设置为空白似乎有点违背直觉。我本以为它会默认为unset,除非另有明确设置。

这被称为环境路由值(https://www.learnrazorpages.com/razor-pages/tag-helpers/anchor-tag-helper#ambient-路由值),其中当前路由值自动添加到出站链接,如果目标页面与当前页面相同,则出站链接由锚标记助手生成。在Razor Pages的旧版本中,这是所有页面的默认行为。

正如您所发现的,您可以通过将路由值设置为空字符串来覆盖它,或者按照其他地方的建议,为链接使用纯锚标记。

默认情况下,

asp-page标记助手会将id值添加到路由中。它是经过设计的。如果您不想添加它,可以尝试使用href来替换asp-page:

<a href="/News">All Articles</a>

最新更新