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
相关产品推荐
相关产品推荐

