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..... }
есть ли способ получить доступ к объекту из действия, которое выполняется в данный момент.
- как эффективно запускать два фильтра неравенства по запросам в приложении
- MATLAB: применить фильтр низких частот или верхних частот к массиву
- IE 8: исправление фонового размера
- Строковые алгоритмы подобия?
- Как заставить мое приложение Android отображаться в списке общего доступа другого приложения
Я бы рекомендовал поместить его в данные маршрута.
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(); }