如果我在
中的ASP.NET MVC中的自定义操作过滤器中创建对象public override void OnActionExecuting(ActionExecutingContext filterContext)
{
DetachedCriteria criteria = DetachedCriteria.For<Person>();
criteria.Add("stuff");
// Now I need to access 'criteria' from the Action.....
}
有什么方法可以从当前正在执行的Action访问该对象。
答案 0 :(得分:61)
Phil Haack描述了better approach。
基本上这就是你所做的:
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");
}
}
唯一的问题是,如果要创建对象参数,那么您的类(在本例中为Person)必须具有默认构造函数,否则您将获得异常。
以下是您使用上述过滤器的方法:
[AddActionParameter]
public ActionResult Index(int number, Person person)
{
// Now you can use number and person variables.
return View();
}
答案 1 :(得分:50)
我建议把它放在路线数据中。
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();
}
答案 2 :(得分:38)
您可以使用HttpContext
:
filterContext.HttpContext.Items["criteria"] = criteria;
你可以在行动中阅读:
[YourActionFilter]
public ActionResult SomeAction()
{
var criteria = HttpContext.Items["criteria"] as DetachedCriteria;
}
答案 3 :(得分:3)
如果将项目作为参数传递给您的操作,请在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();
}