我有一个使用.Net Core 3
的ASP.Net Core MVC应用程序(用F#编写),该视图在外部Razor类库中具有视图(因为您不能混合使用C#和F#),但是,当我运行时在应用程序中找不到视图。
MVC应用程序确实具有对类库的引用,但是当我使用dotPeek查看类库DLL时,其中没有任何已编译的视图:
这是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>
项目中有个视图:
我猜测csproj
文件很可能是错误的,但是我该如何解决?
答案 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>
但是再说一次,这种方法是当您想要编译视图时(例如,用于生成电子邮件或用于生成文档),因此我认为这不是您想要的。确实,如果您需要它来获得控制器动作结果,则视图将在项目组装中进行编译。