5 мая 2011 г.

Передача данных в Master Page из контроллера ASP.Net MVC

Как бы странно это не было, но иногда все-таки необходимо передавать данные не только в представления, но и в мастер страницы.
Впервые я столкнулся с этим, когда мы начали применять в проекте вложенные Master Pages. Поэтому, сегодня я напишу о том, какой способ передачи данных я для себя нашел.
Насколько я знаю, передавать в Master Page модель данных нельзя. Тоесть нужно работать только через ViewData.

На самом деле, можно поступить очень просто, и добавлять во все наши контроллеры сохранение во ViewData нужных данных. После запуска, несмотря на то, что вызвано конкретное представление, ViewData будет доступна и в мастер-странице, которой подчинена текущая.
Способ работает, но что делать, если у нас несколько десятков методов контроллера, а передавать в мастер-страницу нужно одни и те же данные? Добавлять в каждый из них что-то типа "ViewData["Value"]=someValue" - довольно затратное решение.
Выходом из такой ситуации есть переопределение в контроллере метода OnActionExecuting. Этот метод будет выполняться каждый раз при вызове любого Action-а.

Для примера, создадим вот такое вот переопределение в HomeController:

protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
    ViewData["Value"] = DateTime.Now.ToLongTimeString();
    base.OnActionExecuting(filterContext);
}

Вот и все. Теперь, при каждом вызове метода контроллера, и, следовательно, перед вызовом представления, во ViewData будет записываться текущее время, и потом отображаться на Site.Master благодаря коду:

<div id="title">
    <h1>
        My MVC Application</h1>
    <%= ViewData["Value"] %>
</div>

Что мы имеем в результате:

_____