Некомпилированное частичное представление не наследуется от ViewImports - PullRequest
16 голосов
/ 31 мая 2019

Я переместил часть представления в частичное представление.


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

1 Ответ

2 голосов
/ 10 июня 2019

Я публикую этот ответ в качестве временного обходного пути (тем не менее, надеюсь, что ответ будет один, он объяснит, что происходит, и где его найти в официальных ресурсах / документах).


Похоже, что он не сложнее, чем для скомпилированного частичного представления, он использует скомпилированный _ViewImports.cshtml, а для любого некомпилированного требуется копия _ViewImports.cshtml в расположении по умолчанию, папке Pages\.

В моем случае что-то вроде этого

\Pages\Partial\
  _Application.cshtml

\Pages\
  _ViewImports.cshtml

\
  AsonCore.Views.dll

Также получается, что можно взять любой другой скомпилированный файл основного вида (который не был удален при публикации, как я это делал с частичным представлением), скопировать его в папку Pages\, отредактировать, если хотите и он перезагрузит и переопределит скомпилированный файл, который находится в views.dll


Хотя вышеупомянутое будет отображать исключение (при попытке выполнить некомпилированные представления во время выполнения), но с помощью этого ответа это работает, что говорит:

Чтобы исправить это, вы должны опубликовать папку add refs подпапку с некоторые сборки во время выполнения. Эта папка refs обычно создается, если вы опубликовать проект с MvcRazorCompileOnPublish, установленным на false. Так что вы должен один раз опубликовать без предварительной компиляции в другую папку и скопируйте оттуда refs подпапку.

Обратите внимание, что может быть какой-то другой способ, чем использовать эту папку refs в Core 2.2, и если кто-то знает, пожалуйста, не стесняйтесь редактировать мой ответ с этим

...