2

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

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

dotPeek 反汇编

这是csprojRazor 类库的:

<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>

并且项目中Views:

Razor 类库解决方案资源管理器

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

4

2 回答 2

1

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

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

于 2019-10-10T13:14:31.640 回答
-1

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

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

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

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

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

但是话又说回来,这种方法是当您想要自己编译视图时,例如用于电子邮件生成或文档生成,所以我认为这不是您正在寻找的。确实,如果您需要它来获得控制器动作结果,则视图将在项目程序集中编译。

于 2019-10-10T13:47:41.367 回答