Это, наверное, основной вопрос, но пока я не могу понять, как это можно решить.
У меня есть _Layout.cshtml
который имеет некоторую разметку, чтобы описать, какой пользователь входит в систему. Эта информация хранится в моей базе данных, поэтому мне нужно получить это на всех моих представлениях.
В моем приложении много просмотров, и эта информация должна отображаться на всех страницах.
Как я могу решить эту проблему, не получая эту информацию на всех моих контроллерах?
Обновление, мое решение было таким, используя руководство @Jayesh Goyani:
[ChildActionOnly]
public async Task<ActionResult> GetDashboardView()
{
var model = new DashboardModel();
/* fill model from database */
return model != null ? PartialView("_DashboardView", model) : null;
}
С помощью _DashboardView
находится в моем /Views/Dashboard/_DashboardView.cshtml
:
@model DashboardViewModel
<p>@Model.MyProperty</p>
И используется так в моем _Layout.cshtml
:
@{Html.RenderAction("GetDashboardView", "Dashboard");}
Правильный способ - вызвать Html.RenderAction() внутри файла макета, где вы хотите получить подробные сведения о пользователе. Затем создайте подходящий Action-метод где-нибудь, который читает данные учетной записи пользователя и возвращает их как представление (частичное представление) или как raw html (return Content ("...")).
Таким образом, вы также можете извлечь выгоду из возможности кэширования страницы макета и сохранить область данных учетной записи пользователя без доступа (поскольку она явно отличается для каждого пользователя).
Настройка ViewBag - не очень хорошая идея, она не сильно печатает и нарушает правильную схему MVC. Используя Filtering в ASP.NET MVC, вы можете добавить деталь пользователя в viewbag по каждому запросу.
@Html.RenderAction("action" ...)
И вернуть частичное представление этим действием с данными, специфичными для пользователя.BaseController
и все другие контроллеры, расширяющие этот контроллер. При этом вам придется использоватьViweBag
но у вас также будет одно место для управления всеми этими данными.