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

ASP.NET Core项目中共享带MVC视图的控制器的最优方案

嘿,在ASP.NET Core场景下,把带MVC视图的控制器跨项目共享不仅完全可行,还是避免重复造轮子的最佳方案之一——核心就是把它们打包成可复用的类库组件,不用再傻乎乎复制代码。下面我给你一步步捋清楚具体怎么做:

1. 选对项目模板:优先用Razor类库(RCL)

官方最推荐的方式是创建Razor类库(Razor Class Library),这是专门为复用Razor视图、控制器、页面设计的模板,不用手动配置一堆资源嵌入规则。如果找不到这个模板,也可以创建普通的ASP.NET Core类库,之后手动补充必要的NuGet包(Microsoft.AspNetCore.Mvc、Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation)。

2. 按ASP.NET Core规范组织文件结构

类库里面的目录结构要和常规MVC项目保持一致,这样MVC框架才能自动识别:

  • 在类库根目录建Controllers文件夹,放你的控制器类,写法和普通项目里的控制器完全一样:
using Microsoft.AspNetCore.Mvc;

namespace SharedMvcComponents.Controllers;

public class SharedDashboardController : Controller
{
    public IActionResult Overview()
    {
        // 这里可以写业务逻辑,比如从共享服务取数据
        return View();
    }
}
  • 再建Views文件夹,里面对应控制器的子目录(比如Views/SharedDashboard),放对应的视图文件Overview.cshtml,Razor语法、模型绑定这些和普通视图毫无区别。如果要共享布局页,直接把布局文件放在类库的Views/Shared里就行。
3. 在主项目中引用并注册组件
  • 先把类库引用到你的ASP.NET Core主项目里(可以直接项目引用,也可以打包成NuGet包后通过NuGet安装)。
  • 然后在主项目的Program.cs(老版本是Startup.cs)里,告诉MVC框架要扫描这个类库的控制器和视图:
var builder = WebApplication.CreateBuilder(args);

// 添加MVC服务,并指定要包含共享类库的程序集
builder.Services.AddControllersWithViews()
    .AddApplicationPart(typeof(SharedDashboardController).Assembly);

var app = builder.Build();

// 常规路由配置,不用额外改,路由会自动匹配共享控制器
app.UseRouting();
app.UseAuthorization();

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

app.Run();

这里的AddApplicationPart是关键,它让MVC框架去指定程序集里查找控制器和视图资源。

4. 访问共享的控制器和视图

主项目启动后,直接通过路由访问就行,比如输入/SharedDashboard/Overview,就能调用类库中的控制器方法,并渲染对应的视图。

几个实用的注意事项
  • 如果共享视图想使用主项目的布局页,直接在视图里写Layout = "_Layout";就行,MVC会自动优先查找主项目的Views/Shared目录。
  • 如果需要在开发时修改类库的视图并实时生效,记得启用运行时编译,在主项目的服务注册里补充:
builder.Services.AddControllersWithViews()
    .AddApplicationPart(typeof(SharedDashboardController).Assembly)
    .AddRazorRuntimeCompilation(options =>
    {
        // 把类库的视图目录加入运行时编译的查找范围
        options.FileProviders.Add(new PhysicalFileProvider(
            Path.Combine(Directory.GetCurrentDirectory(), "../SharedMvcComponents/Views")));
    });
  • 如果要打包成NuGet包分发,记得在类库的.csproj里确保视图资源被标记为嵌入资源,Razor类库模板会自动帮你做这件事,不用手动配置。

内容的提问来源于stack exchange,提问作者Irakli Lomidze

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 12:02:50