You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 02:23:25