.NET 7 Web应用发布报错:Microsoft.AspNetCore.Mvc.Core已弃用
解决Microsoft.AspNetCore.Mvc.Core弃用报错及子区域路由替代方案
一、修复发布报错问题
Microsoft.AspNetCore.Mvc.Core在.NET 6+已被整合进ASP.NET Core共享框架,无需单独引用,按以下步骤处理:
- 检查Web应用、SicotX.Global、SicotX.Business.Shared所有项目的
.csproj文件,删除对Microsoft.AspNetCore.Mvc.Core的显式包引用:<!-- 移除这行 --> <PackageReference Include="Microsoft.AspNetCore.Mvc.Core" Version="xxx" /> - 确保所有项目都引用ASP.NET Core共享框架:
<ItemGroup> <FrameworkReference Include="Microsoft.AspNetCore.App" /> </ItemGroup> - 清理缓存并重新还原依赖:
dotnet clean dotnet restore
二、子区域路由替代方案
方案1:自定义SubAreaAttribute简化路由标记
直接继承内置RouteAttribute,自动拼接子区域路径,兼容原有使用习惯:
public class SubAreaAttribute : RouteAttribute { // 通用模板,自动匹配子区域参数 public SubAreaAttribute(string template) : base($"{{area:exists}}/{{subarea:exists}}/{template}") { } // 指定固定子区域名称的重载 public SubAreaAttribute(string subAreaName, string template) : base($"{{area:exists}}/{subAreaName}/{template}") { } }
控制器使用示例:
[Area("Admin")] [SubArea("UserManagement")] public class UsersController : Controller { // 路由自动生成为 /Admin/UserManagement/Users/Index public IActionResult Index() => View(); }
方案2:端点路由直接配置子区域规则
在Program.cs中手动定义子区域路由模板,灵活性更高:
// 子区域路由优先级最高 app.MapControllerRoute( name: "subarea_route", pattern: "{area:exists}/{subarea:exists}/{controller=Home}/{action=Index}/{id?}"); // 保留原有区域路由作为降级 app.MapControllerRoute( name: "area_route", pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}"); // 默认路由 app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
控制器只需标记Area,路由参数中指定subarea即可:
[Area("Admin")] public class UsersController : Controller { [Route("{subarea:exists}/Users/Index")] public IActionResult Index() => View(); }
方案3:自定义路由约束验证子区域合法性
如果需要限制子区域的合法名称,可创建路由约束:
public class SubAreaConstraint : IRouteConstraint { // 定义允许的子区域列表 private readonly HashSet<string> _validSubAreas = new() { "UserManagement", "Settings", "Reports" }; public bool Match(HttpContext? httpContext, IRouter? route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection) { if (values.TryGetValue(routeKey, out var value) && value is string subArea) { return _validSubAreas.Contains(subArea); } return false; } }
注册约束并应用到路由:
builder.Services.Configure<RouteOptions>(options => { options.ConstraintMap.Add("subarea", typeof(SubAreaConstraint)); }); app.MapControllerRoute( name: "valid_subarea_route", pattern: "{area:exists}/{subarea:subarea}/{controller=Home}/{action=Index}/{id?}");
内容的提问来源于stack exchange,提问作者Aldemar Cuartas Carvajal
相关产品推荐
相关产品推荐

