c# - 防止来自 URL 的环境路由值在 ASP.NET 中自动添加到 Html.Action 和 Html.ActionLinks
问题描述
在我的 ASP.NET Core 2.1 项目中,我注意到我的Html.ActionLinks
andHtml.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
? 并且仅使用id
if 它显式设置为 an 中的值Action
or ActionLink
?
解决方案
你试过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,查询字符串也将被删除。
推荐阅读
- css - 选择任何字符串时的 CSS 属性
- scikit-learn - Sklearn中带有线性回归的梯度下降
- android - 如何禁用 CordovaWebView 组件的可访问性 (IMPORTANT_FOR_ACCESSIBILITY_NO)
- python - Flasgger:Swagger 应用程序 - http://127.0.0.1:5000/apidocs/ - 获取错误INTERNAL SERVER ERROR /apispec_1.json
- python - PyInstaller/py2exe - OSError: [WinError 193] %1 不是有效的 Win32 应用程序
- django - 上传新图片时如何不删除默认图片?
- css - Next.js Image - 如何保持纵横比并在需要时添加信箱
- c# - 收到错误“没有要关闭的令牌。路径''。” 来自 JsonWriter (NewtonSoft.Json 13.0.1)
- spring - 无法使用嵌入式 tomcat 服务器在 springboot 中运行控制器类处理程序方法
- javascript - 如何显示一些 json 对象