将“自定义操作筛选器”中的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(); }