Razor Class 库不包含 DLL 中的视图

Razor Class Library doesn't include Views in DLL

我有一个 ASP.Net 核心 MVC 应用程序(用 F# 编写),使用 .Net Core 3,它在外部 Razor Class 库中有视图(因为你不能混合使用 C# 和F#),但是,当我 运行 应用程序时,找不到视图。

MVC 应用程序确实有对 class-库的引用,但是当我使用 dotPeek 查看 class-库 DLL 时,它没有任何编译视图:

这是 Razor class 库的 csproj

<Project Sdk="Microsoft.NET.Sdk.Razor">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.0</TargetFramework>
    <AddRazorSupportForMvc>true</AddRazorSupportForMvc>
  </PropertyGroup>

  <ItemGroup>
    <FrameworkReference Include="Microsoft.AspNetCore.App" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\SportsStore.Infrastructure\SportsStore.Infrastructure.fsproj" />
    <ProjectReference Include="..\SportsStore.Models\SportsStore.Models.fsproj" />
    <ProjectReference Include="..\SportsStore.TagHelpers\SportsStore.TagHelpers.fsproj" />
  </ItemGroup>
</Project>

项目中有 个视图:

我猜测 csproj 文件很可能是错误的,但我该如何修复它?

视图是 RCL 中的嵌入式资源。您可以访问它们,就好像它们实际上位于项目中的相同文件系统位置一样。我认为,这里的问题是您在项目根目录下有视图,而不是在 Views/Pages 下,这是按照惯例搜索视图的地方。

您可以更改该约定,但您需要在使用此 RCL 的每个项目上都这样做,这会很复杂,因为您需要将每个文件夹单独添加为单独的位置搜索视图,因为没有公共根文件夹。更好的解决方案是遵循惯例,将您的视图实际放在 Views 目录下。也就是说,不是{project root}/Shared/_Layout.cshtml,而是{project root}/Views/Shared/_Layout.cshtml.

如果你真的想这样做,你可以这样:

在 API 项目(csproj、fproj)中强制将 razor 文件从构建时的编译中排除,并确保在运行时进行编译(所有 razor 和 C# 依赖项)

<MvcRazorCompileOnPublish>false</MvcRazorCompileOnPublish>
<MvcRazorExcludeRefAssembliesFromPublish>false</MvcRazorExcludeRefAssembliesFromPublish>

现在我们必须确保在构建或发布时复制视图。因此,对于手动声明的项目 (csproj) 中的任何视图,您必须添加此

 <None Include="Account\Login.cshtml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>

但话又说回来,这种方法适用于您自己编译视图的情况,例如用于生成电子邮件或生成文档,所以我认为这不是您想要的。确实,如果您需要它作为控制器操作结果,视图会在项目程序集中编译。