【问题标题】:Uncompiled partial view doesn't inherit from ViewImports未编译的局部视图不继承自 ViewImports
【发布时间】:2019-10-16 21:15:12
【问题描述】:

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


_ViewImports.cshtml

@using AsonCore.Helpers
@using AsonCore.Models
@namespace AsonCore.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

Application.cshtml

@page
@model ApplicationModel

<partial name="/Pages/Partial/_ApplicationPartial.cshtml" />

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

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

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

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

还将@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers 添加到已修复的视图中,但我的问题是,这是需要/应该如何完成的吗?

或者是否有任何其他方法可以防止编译特定视图,保留“ViewImports”的继承?

【问题讨论】:

    标签: c# asp.net-core razor-pages asp.net-core-2.2


    【解决方案1】:

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


    看起来它并不比编译的局部视图复杂,它使用编译的_ViewImports.cshtml,对于任何未编译的,它需要在其默认位置Pages\文件夹中的_ViewImports.cshtml的副本。

    在我的情况下是这样的

    \Pages\Partial\
      _Application.cshtml
    
    \Pages\
      _ViewImports.cshtml
    
    \
      AsonCore.Views.dll
    

    事实证明,可以将任何其他已编译的主视图文件(在发布时未删除,就像我对部分视图所做的那样),将其复制到 Pages\ 文件夹,如果需要编辑它到,它会重新加载并覆盖已编译的,驻留在 views.dll


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

    要更正此问题,您必须在发布文件夹时添加 refs 子文件夹 一些运行时程序集。如果您这样做,则通常会创建此 refs 文件夹 发布项目,MvcRazorCompileOnPublish 设置为 false。那么你 必须一次在没有预编译的情况下发布到另一个文件夹,并且 从那里复制这个 refs 子文件夹。

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


    编辑 - ASP.NET Core 3.1

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

    startup 类中

    services.AddRazorPages()
        .AddRazorRuntimeCompilation();
    

    .csproj 文件中

    <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="3.1.4" />
    

    【讨论】:

    • 仅供参考,您可以在 .csproj 文件中将 CopyRefAssembliesToPublishDirectory 设置为 true,而不是设置手动复制文件的规则等。MSBuild 属性记录在 here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多