如何配置ASP.NET Core使API项目视图在自身项目中查找?
搞定API项目视图查找问题的几个实用方案
我明白你的痛点——API项目里明明写了控制器和视图,结果框架偏偏跑到主项目里找,完全忽略了API项目的文件。下面几个方案都是基于你现有的/Main/+/API/结构来的,不用大改文件位置,你可以根据自己的场景选:
方案1:全局配置视图查找优先级(适合多个HTML视图的场景)
如果API里有不止一个HTML视图要返回,直接在API项目的启动配置里给视图引擎加个优先查找路径,让框架先找API项目的Views目录,找不到再去主项目找。
在API项目的Program.cs(或者.NET 5及以前的Startup.cs)里,找到配置MVC服务的地方,加这段代码:
services.AddControllersWithViews() .AddRazorOptions(options => { // 先找API项目下的控制器专属视图 options.ViewLocationFormats.Add("/API/Views/{1}/{0}.cshtml"); // 再找API项目下的共享视图 options.ViewLocationFormats.Add("/API/Views/Shared/{0}.cshtml"); });
这里的{1}对应控制器名称,{0}对应视图名称,配置完之后,API控制器的视图就会优先从/API/Views/[控制器名]/[视图名].cshtml里加载了。
方案2:直接指定视图完整路径(适合仅1%场景的轻量方案)
既然只有1%的场景需要返回HTML,那完全不用全局配置,直接在对应的Action里指定视图的完整路径就行,简单粗暴又有效。
比如你的API控制器里的Action可以这么写:
public IActionResult ReturnFullHtml() { // 直接指向API项目里的视图文件路径 return View("/API/Views/YourController/TargetView.cshtml"); }
这样框架就会精准定位到API项目的视图,不会再跑去主项目瞎找了。
方案3:嵌入式视图(适合API项目是类库且视图不常修改的场景)
如果你的API项目是类库形式,还可以把视图设为嵌入式资源,这样不用依赖文件路径,编译后直接嵌入到程序集里。
步骤很简单:
- 右键API项目里的所有视图文件,选择“属性”,把“生成操作”改成嵌入式资源
- 在API项目的启动配置里加这段代码,让框架能读取嵌入式视图:
services.AddControllersWithViews() .AddEmbeddedViewsForAssembly(typeof(YourApiController).Assembly);
这个方案适合视图写完之后很少改动的场景,部署起来也更方便,不用单独打包视图文件。
最后要注意的小细节
- 确保主项目是项目引用了API项目,不是NuGet包引用,不然路径识别会出问题
- 如果用的是.NET Core 3.1及以上版本,检查Razor编译的配置,别让编译过程跳过了API项目的视图
内容的提问来源于stack exchange,提问作者Jędrzej Danko
相关产品推荐
相关产品推荐

