Самый элегантный способ обеспечить просмотр данных модели модели для _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.