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

ASP.NET Core 6 Web项目如何实现Feature Folder结构并解决兼容报错

ASP.NET Core 6 实现Feature Folder结构解决方案

报错根因

你遇到的类型加载错误是因为**Microsoft.AspNetCore.Mvc.Razor 2.2.0 为.NET Core 2.x专属版本**,ASP.NET Core 3.0及之后所有MVC/Razor相关组件都已经整合到框架共享框架中,无需单独引用对应NuGet包。旧版本包依赖的Microsoft.AspNetCore.Mvc.Internal.MvcRouteHandler类型在后续版本中已经被重构移除,直接引用旧包会出现类型加载冲突。


具体解决步骤

步骤1:清理WebCommon项目依赖

  1. 移除WebCommon项目中引用的Microsoft.AspNetCore.Mvc.Razor 2.2.0 NuGet包
  2. 修改WebCommon项目的.csproj文件,添加ASP.NET Core共享框架引用,替换原先单独引用的MVC相关NuGet包:
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>
  <!-- 添加以下框架引用 -->
  <ItemGroup>
    <FrameworkReference Include="Microsoft.AspNetCore.App" />
  </ItemGroup>
  <!-- 其他项目配置 -->
</Project>

步骤2:在WebCommon中实现Feature Folder视图扩展

实现IViewLocationExpander接口自定义视图搜索路径,适配Feature Folder结构:

using Microsoft.AspNetCore.Mvc.Razor;

public class FeatureViewLocationExpander : IViewLocationExpander
{
    public void PopulateValues(ViewLocationExpanderContext context)
    {
        // 无特殊参数要求可留空
    }

    public IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context, IEnumerable<string> viewLocations)
    {
        // 按Feature Folder结构自定义视图搜索路径,可按需调整
        var featureViewLocations = new[]
        {
            // 路径规则:Features/[Feature名]/[Controller名]/[视图名].cshtml
            "Features/{1}/{0}.cshtml",
            // 路径规则:Features/[Feature名]/[视图名].cshtml
            "Features/{0}.cshtml",
            // 路径规则:Features/Shared/[公共视图名].cshtml
            "Features/Shared/{0}.cshtml"
        };
        // 合并原有视图路径做兼容
        return featureViewLocations.Concat(viewLocations);
    }
}

步骤3:封装服务注册扩展方法

在WebCommon中封装配置扩展,方便WebPublic项目调用:

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Razor;

public static class FeatureFolderServiceExtensions
{
    public static IMvcBuilder AddFeatureFolderSupport(this IMvcBuilder builder)
    {
        // 注册自定义视图位置扩展器
        builder.ConfigureRazorViewEngine(options =>
        {
            options.ViewLocationExpanders.Add(new FeatureViewLocationExpander());
        });
        
        // 如果WebCommon中包含Feature相关控制器/视图,需要注册当前程序集
        builder.AddApplicationPart(typeof(FeatureViewLocationExpander).Assembly);
        
        return builder;
    }
}

步骤4:在WebPublic项目中启用配置

修改WebPublic项目的Program.cs文件,启用Feature Folder支持:

var builder = WebApplication.CreateBuilder(args);

// 注册MVC服务时启用Feature Folder结构
builder.Services.AddControllersWithViews()
    .AddFeatureFolderSupport();

// 其他服务注册逻辑保持不变

var app = builder.Build();

// 中间件配置保持不变,可按需添加Feature专属路由规则
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();

// 可选:添加Feature维度的路由规则
app.MapControllerRoute(
    name: "featureRoute",
    pattern: "{feature}/{controller=Home}/{action=Index}/{id?}");

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

注意事项

  • 如果WebCommon中包含嵌入式Razor视图,需要在WebCommon的.csproj中配置视图为嵌入资源:
    <ItemGroup>
      <EmbeddedResource Include="Features/**/*.cshtml" />
    </ItemGroup>
    
  • 不要在.NET 6及以上版本的项目中单独引用2.x版本的Microsoft.AspNetCore.*系列NuGet包,所有相关API都已包含在共享框架中。

内容的提问来源于stack exchange,提问作者Zbigniew Krumins

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 02:15:07