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