Самый элегантный способ обеспечить просмотр данных модели для _Layout.cshtml - PullRequest
12 голосов
/ 07 июня 2011

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

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

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

Ответы [ 3 ]

24 голосов
/ 07 июня 2011

Я бы создал 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.

3 голосов
/ 07 июня 2011

В зависимости от того, когда вы хотите сгенерировать данные 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();

    }
}
1 голос
/ 22 мая 2013

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

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