Самый элегантный способ обеспечить просмотр данных модели модели для _Layout.cshtml

В моем приложении у меня есть основная информация о пользователе, которая должна отображаться на каждой странице (имя, профиль img). На данный момент я просто установил модель на странице _Layout.cshtml как класс с именем ApplicationBaseModel, и каждая другая модель представления во всем приложении должна наследовать от этого класса, и каждое действие должно установить соответствующие данные для базовой модели.

Я не против простого наследования таким образом, это факт, что в каждом отдельном методе действия я должен возвращать данные и хранить их в модели представления. На мой взгляд, это не очень элегантное решение.

У кого-нибудь есть идеи по другим способам решения этой проблемы?

Ответ 1

Я бы создал BaseController, который извлекает данные в переопределении Initialize() и устанавливает его в свойство ViewBag. Теперь выведите каждый созданный вами контроллер из BaseController и в своем макете используйте свойство ViewBag для доступа к вашим пользовательским данным.

public class BaseController : Controller
{
    protected override void Initialize(System.Web.Routing.RequestContext requestContext)
    {
        base.Initialize(requestContext);

        // retireve data
        var data = new ApplicationBaseModel();

        // set to viewbag
        ViewBag.UserData = data;
    }
}

Таким образом, вам не нужно выводить все ваши классы моделей из ApplicationBaseModel. Вы можете иметь строго типизированные представления и, кроме того, свои пользовательские данные как свойство ViewBag.

Ответ 2

В зависимости от того, когда вы хотите сгенерировать данные ViewBag, вы также можете использовать функции OnActionExecuting или OnActionExecuted. Это может быть более подходящим, поскольку некоторые данные могут быть недоступны в момент создания контроллера.

public class MyController : Controller
{
    //Executes before every action
    protected override void OnActionExecuting(ActionExecutedContext context) 
    {
        //Call the method from the base class
        base.OnActionExecuting(context);

        //Create the ViewBag data here
        ViewBag.XYZ = XYZ();
    }

    //Executes after every action
    protected override void OnActionExecuted(ActionExecutedContext context) 
    {
        //Call the method from the base class
        base.OnActionExecuted(context);

        //Create the ViewBag data here
        ViewBag.XYZ = XYZ();

    }
}

Ответ 3

Другой вариант - вырвать части представления макета, которые требуют данных, и поместить их в частичные. Затем из вашего представления макета сделайте вызов Html.Action для действий, которые возвращают эти частичные данные с необходимыми данными в виде viewmodel.