BeginForm混淆了.NET 6中的控制器路径值



在将我的应用程序从.NET Framework 4.8迁移到.NET6后,Html.BeginForm已开始将斜线更改为"%2F";在控制器路径中,这会导致问题,因为这样它们就变得不可访问。

基本上,这个:

<form action="/Admin/Report/DownloadReport" enctype="multipart/form-data" method="post">

变成这样:

<form action="/Admin%2FReport/DownloadReport" enctype="multipart/form-data" method="post">

发生这种情况的代码示例:

<div class="form-container">
@using (Html.BeginForm("DownloadReport", "Admin/Report", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@Html.Hidden("requestReportName", "PageReport");
<span class="epi-cmsButton">
<input class="epi-cmsButton-text epi-cmsButton-tools epi-cmsButton-Export" type="submit" name="btnSubmitDownloadPageReport" id="btnSubmitDownloadPageReport" value="Download Report" />
</span>}
</div>

是什么原因导致了这种奇怪的行为?我没有发现任何信息表明Html.Beginform在.NET6中已经过时。

编辑:我的路线图:

endpoints.MapControllerRoute(
name: "Admin",
pattern: "Admin/{controller}/{action=Index}");

ASP.NET MVC

如果您正在使用内置控制器工厂,则使用格式为Admin/Report的控制器名称实际上是不正确的。当内置控制器工厂查找控制器时,它使用控制器名称并在YourApp.Controllers.*命名空间中查找Your_Controller_NameController类。

通过使用ASP.NET MVC中MapRoute()方法的namespaces参数定义不同的命名空间,可以映射特定的URL路由。

尝试将@using (Html.BeginForm("DownloadReport", "Admin/Report", FormMethod.Post, new { enctype = "multipart/form-data" }))中的控制器名称固定为Report。我想您的应用程序会发现DownloadReport操作方法没有问题。

请参阅RouteCollectionExtensions.MapRoute方法

ASP.NET核心

我想在将Html.BeginForm("DownloadReport", "Admin/Report"...)中的控制器名称固定为"Report"之后,您的应用程序迁移将正常工作。

如果您将有路由问题,请提供更多信息或参阅以下文章:限制路由到ASP.NET Core 中的控制器命名空间

最新更新