ViewData не передается в макет в ASP.NET Core 2.1 - PullRequest
0 голосов
/ 03 октября 2018

Отредактировано

У меня есть веб-сайт ASP.NET Core 2.1, на котором я установил все элементы Identity.Процесс скаффолдинга создал файл макета в этом месте:

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

Поскольку я хотел использовать макет глобально, я переместил файл макета (с вырезанной вставкой) на этот новыйlocation:

/Views/Shared/AdminLayout/_Layout.cshtml

Затем в первом месте был создан файл _ViewStart.cshtml для использования макета во втором месте.Содержимое файла _ViewStart выглядит следующим образом:

@{
    Layout = "/Views/Shared/AdminLayout/_Layout.cshtml";
    ViewData["ThisOneWorks"] = "some value";
}

Теперь проблема в том, что ViewData s, которые я установил со страниц лесов (например, SetPassword.cshtml, ExtenalLogins.cshtml, ...), не являютсяработает в файле макета.Например, ViewData["Title"] всегда пусто, но ViewData, который я установил в _ViewStart, работает.

Вопрос в том, как я могу использовать ViewData из файлов опознанных лесов, когда яВы используете макет из папки общего доступа?

Редактировать 1:

Кажется, проблема в этой строке:

ViewData["ThisOneWorks"] = "some value";

Когда я удаляю его из _ViewStart, все остальные ViewData работают правильно, но почему?

1 Ответ

0 голосов
/ 05 октября 2018

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

  1. В каком случае ошибка возникнет?

Если вы попытаетесь отобразить страницу, связанную с _ViewStart.cshtml, и если вы одновременно установите ViewData в ViewStart, _Layout.cshtml не будет отображать ееViewData правильно.

Причина, по которой он не может работать.

Короче говоря, причина в том, что ViewData в Layout представляет собой ViewContext.ViewData вместо this.ViewData, который вы установилина вашей странице.См. подробное описание здесь

Walkaround

Ошибка была исправлена ​​в 2.2.0-preview1, и, к сожалению, в 2.1.x нет планов ее исправлять.Если вы не хотите обновлять свой SDK, вы можете использовать HttpContext.Items.Установите Items в вашей RazorPage:

@{
    ViewData["Title"] = "Profile";                   // not working
    HttpContext.Items["Title"]="Workaround - Title"; // workaround
}

рендер Items в вашем _Layout:

<h1>@Context.Items["Title"]----render in layout</h1>
...