将控制器独立到其他项目后,启动项目无法找到视图的解决方案咨询
解决ASP.NET Core类库中视图无法被找到的问题
这个问题我之前也碰到过,把控制器和视图拆分到独立类库后,默认的视图引擎只会盯着启动项目的路径搜索,自然找不到类库里的视图。这里给你两个靠谱的解决方案:
方案一:改用Razor类库(推荐)
ASP.NET Core专门提供了**Razor类库(RCL)**来封装控制器和视图,能自动处理视图的发现逻辑,最省心:
- 先修改控制器项目的
.csproj文件,把项目SDK替换成Razor专用的:<!-- 原来的配置 --> <Project Sdk="Microsoft.NET.Sdk"> <!-- 替换为以下内容 --> <Project Sdk="Microsoft.NET.Sdk.Razor"> - 保持你现有的项目结构不变:
Controllers/HomeController.cs、Views/Home/Index.cshtml - 在启动项目的
Program.cs(或.NET 5及更早版本的Startup.cs)里,你已经添加的services.AddMvc().AddApplicationPart(typeof(HomeController).Assembly);可以保留,确保控制器能被框架发现。
这样配置后,框架会自动识别类库中的视图,不需要额外处理路径问题,直接就能正常访问。
方案二:手动配置嵌入式资源+自定义视图提供器
如果不想改用Razor类库,可以把视图打包成嵌入式资源,再让视图引擎能读取这些资源:
步骤1:修改类库的.csproj,将视图设为嵌入式资源
在类库的.csproj中添加以下配置,让Views下的所有.cshtml文件被嵌入到程序集里:
<ItemGroup> <EmbeddedResource Include="Views/**/*.cshtml" /> <Content Remove="Views/**/*.cshtml" /> </ItemGroup>
步骤2:实现自定义的嵌入式视图文件提供器
创建一个类,用来读取程序集里的嵌入式视图资源:
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc.Razor; using System.Reflection; public class EmbeddedViewFileProvider : IFileProvider { private readonly Assembly _controllerAssembly; private readonly string _assemblyNamespace; public EmbeddedViewFileProvider(Assembly controllerAssembly, string assemblyNamespace) { _controllerAssembly = controllerAssembly; _assemblyNamespace = assemblyNamespace; } public IDirectoryContents GetDirectoryContents(string subpath) { // 简单实现,返回未找到即可 return NotFoundDirectoryContents.Singleton; } public IFileInfo GetFileInfo(string subpath) { // 将视图路径转换为嵌入式资源的命名格式,比如 "/Views/Home/Index.cshtml" → "YourNamespace.Views.Home.Index.cshtml" var resourceName = _assemblyNamespace + subpath.Replace('/', '.').TrimStart('.'); if (_controllerAssembly.GetManifestResourceInfo(resourceName) != null) { return new EmbeddedFileInfo(_controllerAssembly, resourceName); } return new NotFoundFileInfo(subpath); } public IChangeToken Watch(string filter) { // 嵌入式资源不会动态变化,返回空令牌 return NullChangeToken.Singleton; } }
步骤3:在启动项目中配置视图引擎添加该提供器
在Program.cs(或Startup.cs的ConfigureServices方法)里,给Razor视图引擎注册我们的自定义文件提供器:
services.Configure<RazorViewEngineOptions>(options => { var controllerAssembly = typeof(HomeController).Assembly; // 替换成你的控制器类库的命名空间 var assemblyNamespace = "YourControllerProjectNamespace"; options.FileProviders.Add(new EmbeddedViewFileProvider(controllerAssembly, assemblyNamespace)); });
这样视图引擎就会同时搜索启动项目的物理视图和类库中的嵌入式视图了。
内容的提问来源于stack exchange,提问作者Boiethios
相关产品推荐
相关产品推荐

