Библиотека классов Razor не включает представления в DLL - PullRequest
0 голосов
/ 10 октября 2019

У меня есть приложение ASP.Net Core MVC (написанное на F #), использующее .Net Core 3, которое имеет представления во внешней библиотеке классов Razor (поскольку вы не можете смешивать C # и F #), однако, когда я запускаю приложениепредставления не найдены.

Приложение MVC имеет ссылку на библиотеку классов, однако, когда я посмотрел на DLL библиотеки классов, используя dotPeek, в ней не было скомпилированных представлений:

dotPeek dissasembly

Это csproj библиотеки классов Razor:

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

А там * Представления впроект:

Razor class libary Solution Explorer

Я предполагаю, что файл csproj скорее всего неправильный, но как я могу это исправить?

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Просмотр встроенных ресурсов в RCL. Вы получаете к ним доступ так же, как если бы они были физически в проекте в тех же местах файловой системы. Проблема здесь, я думаю, в том, что у вас есть представления в корне проекта, а не в Views / Pages, где представления будут искать по соглашению.

Вы можете изменить это соглашение, но вам нужно будет сделать это в каждом проекте, который использует этот RCL, и это будет сложно, потому что вам нужно будет добавлять каждую папку отдельно в качестве отдельного места для поиска представлений, так как нет общей корневой папки,Лучшее решение состоит в том, чтобы следовать соглашению и фактически поместить ваши представления в каталог Views. Другими словами, вместо {project root}/Shared/_Layout.cshtml оно должно быть {project root}/Views/Shared/_Layout.cshtml.

0 голосов
/ 10 октября 2019

Если вы действительно хотите это сделать, вы можете сделать следующее:

В проекте API (csproj, fproj) принудительно исключить бритвенные файлы из компиляции при сборке и убедиться, что компиляция во время выполнения будет работать (всезависимости от бритвы и C #)

<MvcRazorCompileOnPublish>false</MvcRazorCompileOnPublish>
<MvcRazorExcludeRefAssembliesFromPublish>false</MvcRazorExcludeRefAssembliesFromPublish>

Теперь мы должны убедиться, что при сборке или публикации представления копируются. Так что для любого представления в проекте (csproj), где оно объявлено вручную, вы должны добавить это

 <None Include="Account\Login.cshtml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>

Но опять же, этот подход, когда вы хотите скомпилировать сами представления, например, для генерации электронной почты илидля генерации документов, так что я не думаю, что это то, что вы ищете. Действительно, если вам это нужно для результата действия контроллера, представление компилируется в сборке проекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...