.NET 6升级后ASP.NET Core MVC路由异常问题求助
解决.NET6升级后ASP.NET Core MVC路由匹配异常问题
核心问题分析
- 命名路由名称不匹配:前端表单使用的路由名称是
Resumes.Sections.SetTitle,但后端Action的[Route]特性指定的名称是Resumes.Home.SetTitle,名称不一致导致路由无法匹配。 - 端点路由参数校验逻辑变化:.NET6的端点路由会严格检查Action的所有参数是否能通过路由值提供,
title是POST表单参数而非路由参数,但未标记为可选,导致路由生成时判定参数缺失,返回空URL。 - 路由配置冲突:同时禁用端点路由(
EnableEndpointRouting = false)又调用app.UseRouting(),配置逻辑冲突,引发路由行为异常。
分步解决方案
1. 修正命名路由名称匹配
将前端表单的路由名称与后端Action的命名路由保持一致:
<form asp-route="Resumes.Home.SetTitle" asp-route-id="@Model.SectionId"> <input type="text" name="title" id="formchangetitle"> </form>
2. 明确表单参数来源并标记可选
修改后端Action,用[FromForm]指定title来自表单提交,并设置默认值标记为可选,避免路由生成时将其判定为必需路由参数:
[HttpPost] [AllowAnonymous] [Route("[area]/{id:guid}/[action]", Name = "Resumes.Home.SetTitle")] public async Task<IActionResult> SetTitle(Guid id, [FromForm] string title = null) { // 业务逻辑代码 }
3. 调整路由配置,启用端点路由
.NET6推荐使用端点路由,移除禁用端点路由的配置,确保路由配置逻辑统一:
// 移除禁用端点路由的配置行,替换为标准MVC配置 builder.Services.AddControllersWithViews().AddNewtonsoftJson(); builder.Services.Configure<RouteOptions>(options => { options.AppendTrailingSlash = false; options.LowercaseUrls = true; options.ConstraintMap.Add("culture", typeof(LanguageRouteConstraint)); }); // 保留端点路由中间件 app.UseRouting(); // 添加区域路由配置(若应用使用Area) app.MapControllerRoute( name: "areaRoute", pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}"); // 保留默认路由 app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.UseAuthorization(); // 确保控制器路由映射在授权中间件之后 app.MapControllers();
4. 验证Url.RouteUrl调用
如果使用Url.RouteUrl,确保传入的路由名称正确,且仅提供路由模板所需的参数(id),不需要传入title:
var url = Url.RouteUrl("Resumes.Home.SetTitle", new { id = Model.SectionId });
额外注意事项
- 确认控制器已标记
[Area("Resumes")],确保[area]占位符能正确匹配区域名称。 - 清理冗余的路由配置代码,避免多个路由规则互相干扰。
内容的提问来源于stack exchange,提问作者Rene Kolmos
相关产品推荐
相关产品推荐

