Razor类库在DLL中不包含视图

时间:2019-10-10 11:18:16

标签: c# razor asp.net-core-mvc csproj razor-class-library

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

MVC应用程序确实具有对类库的引用,但是当我使用dotPeek查看类库DLL时,其中没有任何已编译的视图:

dotPeek dissasembly

这是Razor类库的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>

项目中有个视图

Razor class libary Solution Explorer

我猜测csproj文件很可能是错误的,但是我该如何解决?

2 个答案:

答案 0 :(得分:1)

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

您可以更改该约定,但随后需要在每个使用此RCL的项目上执行此操作,这将变得很复杂,因为您需要将每个文件夹分别添加为单独的位置以进行搜索视图,因为没有公用的根文件夹。更好的解决方案是遵循约定并将视图实际放在Views目录下。换句话说,它应该是{project root}/Shared/_Layout.cshtml而不是{project root}/Views/Shared/_Layout.cshtml

答案 1 :(得分:-1)

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

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

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

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

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

但是再说一次,这种方法是当您想要编译视图时(例如,用于生成电子邮件或用于生成文档),因此我认为这不是您想要的。确实,如果您需要它来获得控制器动作结果,则视图将在项目组装中进行编译。