将“自定义操作筛选器”中的ASP.NET MVC Pass对象传递

如果我在ASP.NET MVC中的自定义操作filter中创build一个对象

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

有没有什么办法可以从当前正在执行的Action中访问对象。

我会build议把它放在路线数据。

  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(); } 

Phil Haack描述了更好的方法 。

基本上这是你做的:

 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"); } } 

唯一的问题是,如果你正在创build对象参数,那么你的类(在这个例子中是Person)必须有一个默认的构造函数,否则你将会得到一个exception。

以下是你如何使用上面的filter:

 [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; } 

如果您将其作为parameter passing给您的操作,请在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; } 

这是我认为你更喜欢的无types的版本:

  public override void OnActionExecuting(ActionExecutingContext filterContext) { filterContext.Controller.ViewData.Add("TestValue", "test"); } [FilterWhichSetsValue] public ActionResult About() { string test = (string)ViewData["TestValue"]; return View(); }