.NET6.0中如何配置IRazorViewEngine搜索其他程序集中的视图
.NET 6 跨程序集检索Razor视图解决方案
第一步:配置存储Razor视图的引用类库
首先修改存放公共Razor视图的类库的csproj文件:
- 将Sdk属性从
Microsoft.NET.Sdk改为Microsoft.NET.Sdk.Razor - 添加Razor相关配置,将视图文件设为嵌入资源,示例配置如下:
<Project Sdk="Microsoft.NET.Sdk.Razor"> <PropertyGroup> <TargetFramework>net6.0</TargetFramework> <AddRazorSupportForMvc>true</AddRazorSupportForMvc> <EmbeddedResourceInclude>Views/**/*.cshtml</EmbeddedResourceInclude> </PropertyGroup> <ItemGroup> <FrameworkReference Include="Microsoft.AspNetCore.App" /> </ItemGroup> </Project>
- 确保类库内的视图文件夹结构和主项目保持一致,遵循
Views/控制器名/视图名.cshtml的通用结构即可
第二步:配置主项目
2.1 调整主项目csproj配置
你当前的主项目已经引入了Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation、Microsoft.Extensions.FileProviders.Embedded两个必要依赖,无需额外修改包引用,仅需确认如果主项目是控制台转Web项目,要补充Microsoft.AspNetCore.App框架引用,原生Web项目无需调整。
2.2 注册服务时指定检索的程序集
在Program.cs中注册Razor相关服务时,添加存储视图的外部程序集即可,示例代码如下:
var builder = WebApplication.CreateBuilder(args); // 替换为你引用的视图类库中任意存在的类,用来获取对应程序集实例 var externalViewAssembly = typeof(ExternalViewClassLib.SampleClass).Assembly; builder.Services.AddControllersWithViews() .AddRazorRuntimeCompilation(options => { // 将外部程序集的嵌入文件提供者加入检索列表 options.FileProviders.Add(new EmbeddedFileProvider(externalViewAssembly)); }) .AddApplicationPart(externalViewAssembly); // 将外部程序集加入应用部件列表,Razor引擎会自动扫描其中的视图资源 // 其余服务注册逻辑保持不变 var app = builder.Build(); // 中间件配置逻辑保持不变 app.Run();
第三步:验证调用
配置完成后,原有查找视图的代码无需修改即可正常生效:
var viewResult = _razorViewEngine.FindView(actionContext, viewName, false);
如果仍检索失败,可将FindView的第三个参数改为true(允许检索页面视图)排查,或使用GetView方法指定视图完整路径确认路径规则是否正确。
内容的提问来源于stack exchange,提问作者tayab
相关产品推荐
相关产品推荐

