Вы можете использовать параметр в конструкторе, чтобы передать его:
public ApplicationController(string movieCategory)
{
ViewData["categories"] = DataContext.spMovieCategories(movieCategory);
}
Очевидно, вам нужно будет предоставить это от производных контроллеров, что может быть проблемой, если категория не является специфичной для каждого производного контроллера, что кажется маловероятным:
public DerivedController() : base("Derived Movie Category")
{
// ...
}
Что, вероятно, лучше всего - это удалить поиск категорий из конструктора и переместить его в отдельный метод в ApplicationController. Самый простой способ для вызова этого вызова заключается в том, чтобы вставить вызов в каждое действие, как только у вас есть параметр категории (я предполагаю, что это один из параметров для вызова действия?). Это немного больно.
Предполагаемый способ решения этой проблемы - ActionFilters, если вы создадите новый ActionFilter, подобный этому:
public class CategoryAttribute : ActionFilterAttribute, IActionFilter
{
#region IActionFilter Members
void IActionFilter.OnActionExecuted(ActionExecutedContext filterContext)
{
string category = (string)filterContext.RouteData.Values["category"];
((ApplicationController)filterContext.Controller).PopulateCategory(category);
}
void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
{
}
#endregion
}
Любое действие с примененным атрибутом Category
выполнит этот код. (Я предполагал, что вы переместили код в ApplicationController
в метод с именем PopulateCategory
. Вы также можете применить его на уровне контроллера, что затем вызовет этот ActionFilter для каждого действия в контроллере.
Поскольку вы хотите, чтобы он вызывался для каждого действия на каждом контроллере, вы можете применить его к своему ApplicationController, чтобы каждый производный контроллер унаследовал его:
[Category]
public class ApplicationController : Controller
{
// ...
}
[Правка - Немного лучшее решение]
Тем не менее, еще одним шагом к упрощению является не использование атрибута, а переопределение метода Controller OnActionExecuted (что я только что заметил после написания этого ответа).
Это означает, что вы можете избавиться от класса CategoryAttribute
и атрибута Category
в классе ApplicationController
и просто добавить его в класс ApplicationController
:
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
string category = (string)filterContext.RouteData.Values["category"];
this.PopulateCategory(category);
base.OnActionExecuted(filterContext);
}