在将我的应用程序从.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 中的控制器命名空间