Использование представлений из другой библиотеки классов в моих контроллерах - PullRequest
0 голосов
/ 06 февраля 2019

Допустим, у меня есть класс Lib с именем Controllers и другой класс Lib с именем Views

Внутри Views есть мои .cshtml файлы, а в контроллерах - мои .cs

Как я могу "убедить" мои контроллеры использовать Views из этого проекта / класса lib с именем Views?

Структура проекта:

|
|
|-- MyViews
        |
        |-- MyTestView.cshtml
        |-- Shared
                |
                |-- shared.cshtml
|-- Controllers
|-- AppRunner (Program Main, Startup.cs)

Я пробовал

// {2} is area, {1} is controller,{0} is the action    

services.Configure<RazorViewEngineOptions>(o =>
{
    o.ViewLocationFormats.Clear(); 
    o.ViewLocationFormats.Add("/MyViews/{1}/{0}" + RazorViewEngine.ViewExtension);
    o.ViewLocationFormats.Add("/MyViews/Shared/{0}" + RazorViewEngine.ViewExtension);
}

или

services.Configure<RazorViewEngineOptions>(o =>
{
    o.ViewLocationFormats.Clear(); 
    o.ViewLocationFormats.Add("~/MyViews/{1}/{0}" + RazorViewEngine.ViewExtension);
    o.ViewLocationFormats.Add("~/MyViews/Shared/{0}" + RazorViewEngine.ViewExtension);
}

или

services.Configure<RazorViewEngineOptions>(o =>
{
    o.ViewLocationFormats.Clear(); 
    o.ViewLocationFormats.Add("/../MyViews/{1}/{0}" + RazorViewEngine.ViewExtension);
    o.ViewLocationFormats.Add("/../MyViews/Shared/{0}" + RazorViewEngine.ViewExtension);
}

, но все они возвращают ошибку, которая не может найти файл cshtml в этих местах

1 Ответ

0 голосов
/ 06 февраля 2019

Представления, которые живут в основном веб-приложении, всегда будут переопределять представления из библиотеки классов.Но представления, безусловно, можно использовать из библиотеки классов, отличной от контроллеров.

Для того чтобы открыть представления в библиотеке классов представлений, ваша библиотека классов представлений должна использовать sdk Microsoft.NET.Sdk.Razor,и он должен иметь прямую зависимость от Microsoft.AspNetCore.Mvc

. Без этого он не будет видеть представления в вашей библиотеке классов.

И основное веб-приложение должно ссылаться на библиотеку классов.

Вам не нужна логика расширения местоположения вида.

ОБНОВЛЕНИЕ:

Ваш проект представления csproj должен выглядеть примерно так:

<Project Sdk="Microsoft.NET.Sdk.Razor">
  <PropertyGroup>
    <TargetFrameworks>netstandard2.0</TargetFrameworks>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.1.3" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="path-to-yourview-models-project.csproj" />
      --maybe other project refs here
  </ItemGroup>
</Project>

Примечаниечто Microsoft.NET.Sdk.Razor не является зависимостью пакета.

Также представлениям в вашей библиотеке классов нужны те же соглашения о структуре папок, как если бы они были в основном веб-приложении.

 Views
   Home
      .cshtml files
   Shared
      .cshtml files
   _ViewImports.cshtml

вы можете поместить их в папки, соответствующие имени контроллера без суффикса «Controller», или вы можете поместить их все в общий

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