ViewModel для макета

1

Это, наверное, основной вопрос, но пока я не могу понять, как это можно решить.

У меня есть _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");}
  • 0
    Вы можете выполнить какое-либо действие, которое получит все необходимые данные из базы данных в представлении макета. @Html.RenderAction("action" ...) И вернуть частичное представление этим действием с данными, специфичными для пользователя.
  • 1
    @ meep У меня раньше была похожая проблема. Мой поиск тогда привел меня к решению использовать BaseController и все другие контроллеры, расширяющие этот контроллер. При этом вам придется использовать ViweBag но у вас также будет одно место для управления всеми этими данными.
Теги:
model-view-controller
asp.net-mvc

1 ответ

2
Лучший ответ

Правильный способ - вызвать Html.RenderAction() внутри файла макета, где вы хотите получить подробные сведения о пользователе. Затем создайте подходящий Action-метод где-нибудь, который читает данные учетной записи пользователя и возвращает их как представление (частичное представление) или как raw html (return Content ("...")).

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

Настройка ViewBag - не очень хорошая идея, она не сильно печатает и нарушает правильную схему MVC. Используя Filtering в ASP.NET MVC, вы можете добавить деталь пользователя в viewbag по каждому запросу.

  • 0
    Спасибо, это то, что я закончил. :-)
  • 0
    Обновил мой вопрос с решением для других пользователей :-)
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню