在Visual Studio 2019中发布时未编译某些Razor视图

jutyujz0  于 2023-04-07  发布在  其他
关注(0)|答案(2)|浏览(168)

我有一个有点复杂的解决方案,我有两个ASP.NET Core 2.2项目和另一个项目,他们都共享。共享的项目包含四个Razor视图,我在预构建期间XCOPY到其他项目中。
所有这些都很好,但是当我发布到IIS时,这四个视图并没有被编译到视图程序集中,它们只是作为cshtml文件发布。不幸的是,这导致我有很多空白页,因为这些Razor视图恰好是表单和表格模板...
有谁知道我如何解决这个问题,并强制视图与项目视图的其余部分沿着编译?

更新1

我正在尝试构建一个Razor类库,但我似乎不知道如何正确使用它。

更新2

我放弃了RCL,它似乎不适合普通的MVC项目。
为了避免预构建复制,我将预构建命令移动到一个独立的批处理文件中。这没有帮助,视图仍然被忽略编译并作为cshtml文件发布。所有的razor文件都标记为Build Action = Content,所以我不明白为什么这四个被忽略。

更新3

我重新访问了RCL,并让它与正常的MVC应用程序一起工作。它在本地工作得很好,但是当我发布为发布到IIS时,cshtml文件仍然被复制,编译后的视图被忽略。我和RCL之前处于完全相同的位置。我可以做些什么来阻止它发布cshtml文件?

6kkfgxo0

6kkfgxo01#

我偶然发现了一个issue on the AspNetCore repository,结果发现这是一个工具问题。不幸的是,它在优先级列表中似乎很低,尽管它可能是一个有害的问题。
无论如何,这个问题的OP给了我一个想法,那就是删除包含已发布的cshtml文件的文件夹,然后回收apppool以重新发现已编译的视图。
因为我通过FTP发布,所以在发布过程中我不能做任何事情。所以,我做了一个PowerShell脚本来每分钟检查是否存在违规文件夹。如果找到该文件夹,则将其删除并回收应用池。
我也摆脱了RCL,回到了最初的预构建XCOPY方式。现在它可以工作,但如果工具被修复以避免这样的变通方法,那会更好(当然!)。

oknwwptz

oknwwptz2#

我最近在引入多个具有Razor视图的项目时遇到了这个问题。托管项目的dotnet publish步骤失败,并出现 duplicate items found 错误,因为它多次看到_ViewImports.cshtml
解决此问题的方法是将MSBuild属性EnableDefaultContentItems设置为false,并在.csproj文件中添加相关内容项,如下所示:

<PropertyGroup>
  <EnableDefaultContentItems>false</EnableDefaultContentItems>
</PropertyGroup>

<ItemGroup>
  <!-- Never copy on publish -->
  <Content Include="Views\**\*.cshtml" CopyToPublishDirectory="Never" />
  <Content Include="**\*.json" />
  <Content Include="web.config" />
</ItemGroup>

这里的技巧是CopyToPublishDirectory属性,它将确保这些文件在发布时不会被复制。
只要将RazorCompileOnPublish设置为true(这是默认值),就可以正常工作。

相关问题