首页 > 解决方案 > 防止来自 URL 的环境路由值在 ASP.NET 中自动添加到 Html.Action 和 Html.ActionLinks

问题描述

在我的 ASP.NET Core 2.1 项目中,我注意到我的Html.ActionLinksandHtml.Actions没有id集合,它会自动包含id来自当前 URL 的。

例如,Html.ActionLink在视图中给出以下内容:

<li>@Html.ActionLink("Apply Online", "Apply-Online", "Careers")</li>

如果当前页面的 URL 是localhost:1234/careers/apply-online/53,那么当我在导航中检查href上述内容Html.ActionLink时,它会在生成的 URL 中包含“53”(即使它没有在我的视图中设置)。

如果我明确地将 设置id为空,我可以防止这种情况发生,如下所示:

<li>@Html.ActionLink("Apply Online", "Apply-Online", "Careers", new { id = "" })</li>

但是,有没有办法在无需更新所有操作链接的情况下全面阻止这种情况?

我遇到了奇怪的行为,如果两个控制器具有相同的操作名称(例如Index)并且一个控制器的 URL 具有id,它会将相同的操作添加id到页面上具有匹配名称的所有其他操作。

这是我的路线Startup.cs

app.UseMvc(routes =>
{
    routes.MapRoute(
    name: "default",
    template: "{controller=Home}/{action=Index}/{id?}");
});

更新

根据文档,这似乎AmbientValues是导致此行为的原因:

VirtualPathContext 构造函数的第二个参数是环境值的集合。环境值通过限制开发人员必须在特定请求上下文中指定的值的数量来提供便利。当前请求的当前路由值被认为是链接生成的环境值。在 ASP.NET Core MVC 应用程序中,如果您在 HomeController 的 About 操作中,则无需指定控制器路由值以链接到 Index 操作 - 使用 Home 的环境值。

与参数不匹配的环境值将被忽略,并且当显式提供的值覆盖它时也会忽略环境值,在 URL 中从左到右。

所以这似乎解释了为什么,id如果我{ id = "" }在我的Html.ActionLink.

我的问题是,有没有办法设置id默认不使用环境值,也许在我的MapRoute? 并且仅使用idif 它显式设置为 an 中的值Actionor ActionLink

标签: c#asp.net-mvcrazorasp.net-coreroutes

解决方案


你试过TagHelpers吗?

TagHelpers 取代了 HtmlHelpers,它们更具可读性和易用性。

例如,使用 HtmlHelpers 的链接是这样编写的:

@Html.ActionLink("Apply Online", "Apply-Online", "Careers")

它被替换为...

<a asp-area="" asp-controller="Careers" asp-action="Apply-Online"
asp-route-id="53" 
asp-route-toto="foo">
    Apply Online
</a>
<!-- expected: /Careers/Apply-Online/53?toto=foo -->

显然,如果您删除 asp-route-id,“53”将被删除,如果您删除 asp-route-toto,查询字符串也将被删除。


推荐阅读