ASP.NET MVC Pass-объект из пользовательского фильтра действий в действие

Если я создаю объект в Фильтре пользовательских действий в ASP.NET MVC в

public override void OnActionExecuting(ActionExecutingContext filterContext) { DetachedCriteria criteria = DetachedCriteria.For(); criteria.Add("stuff"); // Now I need to access 'criteria' from the Action..... } 

есть ли способ получить доступ к объекту из действия, которое выполняется в данный момент.

Я бы рекомендовал поместить его в данные маршрута.

  protected override void OnActionExecuting(ActionExecutingContext filterContext) { filterContext.RouteData.Values.Add("test", "TESTING"); base.OnActionExecuting(filterContext); } public ActionResult Index() { ViewData["Message"] = RouteData.Values["test"]; return View(); } 

Более подходящий подход описан Филом Хааком.

В основном это то, что вы делаете:

 public class AddActionParameterAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { base.OnActionExecuting(filterContext); // Create integer parameter. filterContext.ActionParameters["number"] = 123; // Create object parameter. filterContext.ActionParameters["person"] = new Person("John", "Smith"); } } 

Единственная проблема заключается в том, что если вы создаете параметры объекта, то ваш class (в данном случае Person) должен иметь конструктор по умолчанию, иначе вы получите исключение.

Вот как вы использовали бы использованный фильтр:

 [AddActionParameter] public ActionResult Index(int number, Person person) { // Now you can use number and person variables. return View(); } 

Вы можете использовать HttpContext :

 filterContext.HttpContext.Items["criteria"] = criteria; 

И вы можете прочитать его в действии:

 [YourActionFilter] public ActionResult SomeAction() { var criteria = HttpContext.Items["criteria"] as DetachedCriteria; } 

Задайте элемент в ViewData или viewmodel, если вы передадите его в качестве параметра в свое действие. Здесь я установил свойство ViewModel

 public override void OnActionExecuting(ActionExecutingContext filterContext) { ViewModelBase viewModel = null; foreach (object parameter in filterContext.ActionParameters.Values) { if (parameter is ViewModelBase) { viewModel = (ViewModelBase)parameter; break; } } if(viewModel !=null) { viewModel.SomeProperty = "SomeValue"; } } public ActionResult About(ViewModelBase model) { string someProperty= model.SomeProperty; } 

Вот нетипизированная версия, я думаю, вы предпочитаете:

  public override void OnActionExecuting(ActionExecutingContext filterContext) { filterContext.Controller.ViewData.Add("TestValue", "test"); } [FilterWhichSetsValue] public ActionResult About() { string test = (string)ViewData["TestValue"]; return View(); } 
Давайте будем гением компьютера.