未编译的部分视图不会从ViewImports继承

LGS*_*Son 15 c# asp.net-core razor-pages asp.net-core-2.2

我将视图的一部分移到了部分视图。


_ViewImports.cshtml

@using AsonCore.Helpers
@using AsonCore.Models
@namespace AsonCore.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
Run Code Online (Sandbox Code Playgroud)

Application.cshtml

@page
@model ApplicationModel

<partial name="/Pages/Partial/_ApplicationPartial.cshtml" />
Run Code Online (Sandbox Code Playgroud)

_ApplicationPartial.cshtml

@model ApplicationModel
<section class="content application">
    <div>
        <form method="post" enctype="multipart/form-data">
            <div>
                <label asp-for='email.Firstname'>FORNAVN</label>
                <input asp-for='email.Firstname' required />
            </div>
            <div>
                <label asp-for="email.Lastname">ETTERNAVN</label>
                <input asp-for="email.Lastname" required />
            </div>
            <div>
                <input type="submit" value="Send" />
            </div>
        </form>
        <partial name="/Pages/Shared/_FormScript.cshtml" />
    </div>
</section>
Run Code Online (Sandbox Code Playgroud)

_Project.csproj

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp2.2</TargetFramework>
    <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
    <RootNamespace>AsonCore</RootNamespace>
  </PropertyGroup>

  <ItemGroup>
    <Content Remove="Pages\Partial\**" />
  </ItemGroup>

  <ItemGroup>
    <None Include="Pages\Partial\**">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App" />
    <PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.2.0" PrivateAssets="All" />
  </ItemGroup>

</Project>
Run Code Online (Sandbox Code Playgroud)

在构建时,从已编译的views.dll中删除了部分视图,以实现其内容的动态更新,而当我这样做时,最初从中继承的内容就_ViewImports.cshtml停止了。

通过添加@namespace AsonCore.Pages到局部视图,它拾取了Model,但是随后我注意到,在部署到服务器后(尽管它在VS2019中有效),“ TagHelpers”停止了工作。

还添加@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers了固定的观点,但我的问题是,这是需要/应该如何做的?

还是有其他方法可以防止编译特定视图,而保留“ ViewImports”的继承?

LGS*_*Son 2

我发布这个自我回答作为一种临时解决方法(不过仍然希望有一个,这将解释发生了什么,以及在官方资源/文档中哪里可以找到它)。


看起来它并不比已编译的部分视图更复杂,它使用已编译的,对于任何未编译的,它需要在其默认位置(文件夹)中_ViewImports.cshtml复制。_ViewImports.cshtmlPages\

就我而言,是这样的

\Pages\Partial\
  _Application.cshtml

\Pages\
  _ViewImports.cshtml

\
  AsonCore.Views.dll
Run Code Online (Sandbox Code Playgroud)

事实证明,人们可以采用任何其他已编译的主视图文件(在发布时没有删除它,就像我对部分视图所做的那样),将其复制到文件夹中,Pages\如果需要的话进行编辑,然后它将重新加载并覆盖驻留在views.dll中的已编译版本


尽管上面的内容会呈现异常(当尝试在运行时执行未编译的视图时),但在这个答案的帮助下它可以工作,其中说:

要更正此问题,您必须向发布文件夹添加包含一些运行时程序集的refs子文件夹。如果您确实将项目发布为 ,则通常会创建此refs文件夹。因此,您必须一次在没有预编译的情况下发布到另一个文件夹,并从那里复制此refs 子文件夹。MvcRazorCompileOnPublishfalse

请注意,除了在 Core 2.2 中使用此refs文件夹之外,可能还有其他方法,如果有人知道,请随时编辑我的答案


编辑 - ASP.NET Core 3.1

当涉及到refs使用 3.1 的文件夹时,只需执行以下操作即可在发布时复制运行时文件

startup班上

services.AddRazorPages()
    .AddRazorRuntimeCompilation();
Run Code Online (Sandbox Code Playgroud)

.csproj文件中

<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="3.1.4" />
Run Code Online (Sandbox Code Playgroud)