MVC Core, изменена корневая папка вида на пользовательский интерфейс, ошибка: «По умолчанию для макета пользовательского интерфейса Identity требуется частичное представление« _LoginPartial »» - PullRequest
0 голосов
/ 04 октября 2019

Я изменил структуру каталогов для своего сайта MVC Core 2.2. Я поместил Просмотр информации в папке пользовательского интерфейса вне корневой папки. Итак, моя структура папок выглядит следующим образом:

UI +- Areas
   +- Controllers
   +- ViewHelpers
   +- ViewModels
   +- View
      +- Account
       ...
      +- Shared

Теперь я получаю следующую ошибку при переходе к представлению, контроллер которого имеет [Authorize] . Если я удаляю атрибут authorize, ошибка исчезает. Ошибка выглядит следующим образом:

InvalidOperationException: The default Identity UI layout requires a partial view '_LoginPartial' usually located at '/Pages/_LoginPartial' or at '/Views/Shared/_LoginPartial' to work. Based on your configuration we have looked at it in the following locations:
/Areas/Identity/Pages/Account/_LoginPartial.cshtml
/Areas/Identity/Pages/_LoginPartial.cshtml
/Areas/Identity/Pages/Shared/_LoginPartial.cshtml
/Areas/Identity/Views/Shared/_LoginPartial.cshtml
/Pages/Shared/_LoginPartial.cshtml
/Views/Shared/_LoginPartial.cshtml.
Microsoft.AspNetCore.Identity.UI.V4.Pages.Internal.Areas_Identity_Pages__Layout.<ExecuteAsync>b__42_1()

В моем методе ConfigureServices у меня есть следующее:

public void ConfigureServices(IServiceCollection services)
{
    ...
    services.Configure<RazorViewEngineOptions>(o =>
    {
        o.ViewLocationFormats.Clear();
        o.ViewLocationFormats.Add("/UI/Views/{1}/{0}" + RazorViewEngine.ViewExtension);
        o.ViewLocationFormats.Add("/UI/Views/Shared/{0}" + RazorViewEngine.ViewExtension);
        o.PageViewLocationFormats.Add("/UI/Areas/Identity/Pages/{1}/{0}" + RazorViewEngine.ViewExtension);
    });
    services.AddSession();
}

Было бы здорово, если бы я мог также понять, что происходит.

Ответы [ 2 ]

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

Исходя из ошибки, проект не нашел _LoginPartial в месте появления сообщения об ошибке, попробуйте следующие два метода:

  1. , непосредственно добавьте _LoginPartial в UI/Areas/Identity/Pages и измените PageViewLocationFormats на AreaPageViewLocationFormats в вашей конфигурации

        services.Configure<RazorViewEngineOptions>(o =>
        {
    
            o.ViewLocationFormats.Clear();
            o.ViewLocationFormats.Add("/UI/Views/{1}/{0}" + RazorViewEngine.ViewExtension);
            o.ViewLocationFormats.Add("/UI/Views/Shared/{0}" + RazorViewEngine.ViewExtension);
    
            o.AreaPageViewLocationFormats.Clear();
            o.AreaPageViewLocationFormats.Add("/UI/Areas/Identity/Pages/{1}/{0}" + RazorViewEngine.ViewExtension);
        });
    

    enter image description here

  2. Добавьте еще один AreaPageViewLocationFormat, как показано ниже:

        services.Configure<RazorViewEngineOptions>(o =>
        {
    
            o.ViewLocationFormats.Clear();
            o.ViewLocationFormats.Add("/UI/Views/{1}/{0}" + RazorViewEngine.ViewExtension);
            o.ViewLocationFormats.Add("/UI/Views/Shared/{0}" + RazorViewEngine.ViewExtension);
    
            o.AreaPageViewLocationFormats.Clear();
            o.AreaPageViewLocationFormats.Add("/UI/Areas/Identity/Pages/{1}/{0}" + RazorViewEngine.ViewExtension);
            o.AreaPageViewLocationFormats.Add("/UI/Views/Shared/{0}" + RazorViewEngine.ViewExtension);
        });
    
0 голосов
/ 14 октября 2019

Это мое решение для перемещения кода Identity Scaffolding .

Я пытаюсь использовать Очистить архитектуру в преобразовании .Net Framework MVC / APIИдентификационный сайт для сайта MVC Core 2.2. Мое вдохновение пришло из следующего видео: Чистая архитектура с ASP.NET Core 2.2 - Джейсон Тейлор

Моя версия структуры каталогов выглядит следующим образом:

\+- Application 
 |  +- Commands
 +- Domain
 |  +- Entities
 +- Infrastructure
 +- UI
    +- Identity
    |  +- Pages
    |     +- Account
    |      ...
    +- Controllers
    +- ViewHelpers
    +- ViewModels
    +- View
       +- Company
           ...
          +- Shared

В моем приложении я изменил классы IdentityUser и IdentityRole , а каталог Scaffolding Identity не соответствует приведенному выше. К сожалению, я не смог найти пример того, как обрабатывать каталог Identity по умолчанию.

Мое решение состояло в том, чтобы создать Идентификатор скаффолдинга и преобразовать из области в формат страницы . Это процесс, который требует много поиска и замены и чреват проблемами.

Первый шаг - создание структуры каталогов. Следующим шагом является создание Идентификатор лесов . Существует множество инструкций, но у меня работает документация Microsoft . Вы должны получить это работает в первую очередь, прежде чем перемещать папку! Чтобы заставить Identity работать, вам нужно найти и заменить UserManager и SignInManager . Выполните окончательный поиск (только) для IdentityUser и вручную исправьте страницу DownloadPersonalDataModel.

Добавьте оператор using на страницы бритвы, которые ссылаются на ApplicationUser:

, используя.Domain.Entities;

и _LoginPartial

@ с использованием .Domain.Entities

Test it.

Перетащите папку Controllers / Views / Models в папку пользовательского интерфейса. Я переименовал Модели в ViewModels (необязательно). Поиск и замена пространств имен на новые пространства имен.

  • .Controllers -> .UI.Controllers
  • .Models -> .UI.ViewModels (в _ViewImports.cshtml)
  • / Views / Shared / -> / UI / Views / Shared /

Добавьте параметры движка Razor View для поиска нового пути пользовательского интерфейса для вида / страницы / области следующим образом:

services.Configure<RazorViewEngineOptions>(o =>
{
    // {2} is area, {1} is controller,{0} is the action
    o.ViewLocationFormats.Clear();
    o.ViewLocationFormats.Add("/UI/Views/{1}/{0}" + RazorViewEngine.ViewExtension);
    o.ViewLocationFormats.Add("/UI/Views/Shared/{0}" + RazorViewEngine.ViewExtension);
    // now razor pages
    o.PageViewLocationFormats.Clear();
    o.PageViewLocationFormats.Add("/UI/Views/{1}/{0}" + RazorViewEngine.ViewExtension);
    o.PageViewLocationFormats.Add("/UI/Views/Shared/{0}" + RazorViewEngine.ViewExtension);
    o.PageViewLocationFormats.Add("/UI/Identity/Pages/Account/Manage/{0}" + RazorViewEngine.ViewExtension);
    //
    o.AreaViewLocationFormats.Clear();
    o.AreaViewLocationFormats.Add("/UI/Views/{1}/{0}" + RazorViewEngine.ViewExtension);
    o.AreaViewLocationFormats.Add("/UI/Views/Shared/{0}" + RazorViewEngine.ViewExtension);
    // now razor areas
    o.AreaPageViewLocationFormats.Add("/UI/Views/{1}/{0}" + RazorViewEngine.ViewExtension);
    o.AreaPageViewLocationFormats.Add("/UI/Views/Shared/{0}" + RazorViewEngine.ViewExtension);
    Console.WriteLine(o);
});

Если вы получаете сообщение об ошибке «Обнаружены следующие местоположения:», Console.WriteLine, описанный выше, является отличным местом для установки точки останова, чтобы увидеть, что доступно и что установлено.

Проверка доступа к странице. Когда все чисто, вы можете перетащить папку Identity в папку ** UI *. Найдите и замените пространство имен на новое пространство имен. - .Areas.Identity -> .UI.Identity

Изменить _LoginPartial и искать и заменять области (для удаления области): - asp-area = "Identity" -> asp-area = ""

Измените параметры MVC Razor следующим образом:

services.AddMvc()
    .SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
        .AddRazorPagesOptions(options =>
        {
            options.AllowAreas = false;
            options.Conventions.Clear();
            options.RootDirectory = "/UI/Identity/Pages";
            Console.WriteLine(options);
        });

Измените параметры двигателя Razor View следующим образом:

services.Configure<RazorViewEngineOptions>(o =>
{
    ...
    // now razor areas
    o.AreaPageViewLocationFormats.Clear();
    o.AreaPageViewLocationFormats.Add("/UI/Views/{1}/{0}" + RazorViewEngine.ViewExtension);
    o.AreaPageViewLocationFormats.Add("/UI/Views/Shared/{0}" + RazorViewEngine.ViewExtension);
    o.AreaPageViewLocationFormats.Add("/UI/Identity/Account/Manage/{0}" + RazorViewEngine.ViewExtension);
    Console.WriteLine(o);
}

Теперь попробуйте ... путь к Личность страниц больше не / Личность / Счет , но теперь / Учетная запись

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