从自定义操作筛选器到操作的ASP.NET MVC Pass对象

时间:2009-11-27 14:18:33

标签: asp.net-mvc filter custom-action

如果我在

中的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访问该对象。

4 个答案:

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