Вы можете написать атрибут фильтра настраиваемого действия и применить этот атрибут к базовому контроллеру или ко всем действиям, которым необходимо ввести эту информацию:
public class AdditionalViewDataInjectorAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
filterContext.Controller.ViewData["foo"] = "bar";
}
}
И затем украсить базовый контроллер следующим атрибутом:
[AdditionalViewDataInjector]
public class BaseController: Controller { }
В ASP.NET MVC 3 существует понятие фильтров глобальных действий , поэтому вам даже не нужно иметь базовый контроллер или украшать все ваши действия этим фильтром.Существует обходной путь , позволяющий добиться того же в ASP.NET MVC 2 .Теперь все ваши представления получают это дополнительное свойство в данных представления.
Как уже говорилось, предыдущий - это уродливый обходной путь, и я не рекомендую его (ViewData уродлив).Вы можете взглянуть на помощников Html.Action и Html.RenderAction .Вот как это может выглядеть:
public class MySpecialController: Controller
{
public ActionResult Index()
{
// Here you have access to the request, cookies, session, routes, ...
var someModel = GetSomeModel();
return View(someModel);
}
}
Затем создайте строго типизированный фрагмент, который будет содержать требуемый HTML (~/Views/MySpecial/Index.ascx
), и, наконец, включите его в свою главную страницу:
<%= Html.Action("index", "myspecial") %>