ASP.NET Core 3.0 - Identity UI Управление папкой, не получающей макет - PullRequest
1 голос
/ 02 ноября 2019

У меня есть Identity, помеченный в соответствии с документацией, и все работает правильно, кроме макета папки /Manage. Директория настроена точно так же, как и на леса.

Настройка каталога со всеми ошибками. удаленные файлы

Для ясности: /Areas/Identity/Pages/Account/Manage - это проблемная папка.

/Pages Содержит файл _ViewStart, который устанавливает макет из моих представлений /Общая папка.
/Pages/Account Получает макет от _Viewstart и работает правильно.
/Pages/Account/Manage Все здесь только получает макет _ViewStart. Файл _Layout, находящийся здесь, не будет автоматически найден на страницах внутри него.

Areas/Identity/Pages/Account/Manage/_Layout.cshtml

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h1>Manage your account</h1>

<div>
    <h4>Change your account settings</h4>
    <hr />
    <div class="row">
        <div class="col-md-3">
            <partial name="_ManageNav" />
        </div>
        <div class="col-md-9">
            @RenderBody()
        </div>
    </div>
</div>

@section Scripts {
    @RenderSection("Scripts", required: false)
}

Это именно то, как он вставляется в скаффолд, и макет ломается только тогда, когда выизмените AddDefaultIdentity () на AddIdentity (). Я работаю со ссылкой, которую я создал, и это заставляет меня поверить, что я ничего не учел при удалении пользовательского интерфейса по умолчанию. Единственный обходной путь, который я нашел, - это вручную настроить макет каждого файла .cshtml в /Manage

@{
    Layout = "_Layout";
}

. Это исправляет все и заставляет компоновку работать должным образом для страниц внутри /Manage. Я прочитал документацию и в ней говорится, что каждый контроллер Razor Page должен искать в своей папке файл _Layout, прежде чем искать в другом месте. Есть ли причина, по которой он не обнаруживает файл?

1 Ответ

0 голосов
/ 04 ноября 2019
  1. "Единственный найденный мной обходной путь - ручная настройка макета каждого файла .cshtml в / Manage":

    Вам не нужно этого делать,Просто создайте _ViewStart.cshtml под своим Manage/ foler:

    @* file: Manage/_ViewStart.cshtml *@
    @{
        Layout = "_Layout";    // Use a partial layout name instead of absolute name
    }
    

    Также будьте осторожны, что по умолчанию Manage/Layout.cshtml использует родительский макет /Areas/Identity/Pages/_Layout.cshtml, который может не существовать вваши файлы скаффолдинга:

    @* file: Manage/Layout.cshtml *@
    @{
        Layout = "/Areas/Identity/Pages/_Layout.cshtml";  // you might want to change this to `/Views/Shared/_Layout.cshtml`
    }
    
  2. "в нем говорится, что каждый контроллер Razor Page должен искать в своей папке файл _Layout перед поиском в другом месте"

    Это верно, только если вы используете частичное _Layout имя. Однако, если вы используете абсолютное имя, начинающееся с косой черты, оно будет использовать этот макет напрямую . См. Официальные документы :

    Когда предоставляется частичное имя , механизм просмотра Razor выполняет поиск файла макета с использованием стандартного процесса обнаружения. Сначала ищется папка, в которой существует метод-обработчик (или контроллер), а затем папка Shared. Этот процесс обнаружения идентичен процессу, используемому для обнаружения частичных представлений.

    В вашем случае имя макета /Areas/Identity/Pages/_Layout.cshtml, начинающееся с /, не является частичным именем,Вот почему ваши страницы не могут обнаружить макет. Чтобы решить эту проблему, вместо этого используйте частичное имя _Layout. (Это может быть сделано с помощью одного _ViewStart.cshtml файла, как я делал выше, не добавляйте его для каждой страницы)

  3. Наконец, вы можете спросить, почему он отображается нормально при использовании AddDefaultIdentity(). Как вы выясните, AddDefaultIdentity() добавит стандартный пользовательский интерфейс , который в конечном итоге вызывает метод AddRelatedParts() . Это позволяет откатиться к пользовательскому интерфейсу по умолчанию, когда такого макета или страницы нет. Например, когда вы добавляете Identity с помощью Visual Studio, он предлагает список, который вы можете использовать для переопределения страниц по умолчанию. Вышеуказанный /Areas/Identity/Pages/_Layout.cshtml взят из интерфейса по умолчанию.

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