【问题标题】:Controller does not find the view when the startup is in another project启动在另一个项目时Controller找不到视图
【发布时间】:2023-04-11 08:33:01
【问题描述】:

为了更轻松地编写集成测试,我将控制器放在另一个项目中,而不是主机(启动的那个)。该项目有以下文件:

|
|-- Controllers
|   +-- HomeController.cs
|
+-- Views
    +-- Home
        +-- Index.cshtml

感谢this solution,我的初创公司可以找到控制器:

services.AddMvc().AddApplicationPart(typeof(HomeController).Assembly);

但是,我没有找到任何方法来设置视图的路径。它似乎是相对于启动位置,而不是控制器:当我运行应用程序时,我得到了那个错误:

InvalidOperationException: The view 'Index' was not found. The following locations were searched:
/Views/Home/Index.cshtml
/Views/Shared/Index.cshtml
/Pages/Shared/Index.cshtml

如何指定视图与控制器在同一个文件夹中?

【问题讨论】:

  • 我试过这个解决方案,但它不起作用:jackhiston.com/2017/8/15/…
  • 我对 Asp.Net Core 不是很熟悉,但是在 .Net Framework MVC 中,你会实现一个自定义的IViewEngine
  • @FrenchBoiethios 1. 我试过上面提到的solution,它对我来说很好用。您是否在库中添加了<EmbeddedResource ...>? 2. 除了该解决方案,更简单的方法是将您的控制器和视图项目更改为 [Razor 组件库,RCL],然后简单地添加对 RCL 的引用,在这种情况下,不需要AddApplicationPart()Configure<RazorViewEngineOptions>
  • @itminus 1. 我很笨,我确实在宿主项目中添加了<EmbeddedResource> 标签。当我把它放在库项目 2 中时它就可以工作。这个解决方案确实是最好的解决方案。既然你解决了我的问题,你能写一个答案吗?

标签: c# asp.net-mvc asp.net-core asp.net-core-mvc


【解决方案1】:
  1. 我尝试了您上面提到的解决方案,对我来说效果很好。您是否在库中添加了<EmbeddedResource ...>

  2. 除了该解决方案,更简单的方法是将控制器和视图项目更改为 Razor component Library, RCL

<Project Sdk="Microsoft.NET.Sdk.Razor">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.2.0" />
  </ItemGroup>
</Project>

然后简单地添加对RCL的引用,在这种情况下,不需要AddApplicationPart().Configure&lt;RazorViewEngineOptions&gt;()

【讨论】:

  • Microsoft.AspNetCore.Mvc 的引用在我的 csproj 中被标记为私有,因此我必须删除 PrivateAssets="All" 才能使此解决方案正常工作。
  • @FrenchBoiethios 我更新了 RCL 的演示 *.csproj 供参考:)
猜你喜欢
  • 2021-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多