ASP.NET MVC passe l'objet du filtre D'Action personnalisé à L'Action

Si je crée un objet dans un filtre D'Action personnalisé ASP.NET MVC dans

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    DetachedCriteria criteria = DetachedCriteria.For<Person>();
    criteria.Add("stuff");

    // Now I need to access 'criteria' from the Action.....

}

Est-il possible d'accéder à l'objet à partir de l'Action en cours d'exécution.

57
demandé sur reach4thelasers 2009-11-27 17:18:32

4 réponses

Je recommande de le mettre dans les données de Route.

    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();
    }
49
répondu Chad Moran 2009-11-27 16:16:41

Le meilleure approche est décrite par Phil Haack.

Fondamentalement, c'est ce que vous faites:

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

Le seul gotcha est que si vous créez des paramètres d'objet, votre classe (dans ce cas Person) doit avoir un constructeur par défaut, sinon vous obtiendrez une exception.

Voici comment vous utiliseriez le filtre ci-dessus:

[AddActionParameter]
public ActionResult Index(int number, Person person)
{
    // Now you can use number and person variables.
    return View();
}
61
répondu niaher 2016-01-04 18:36:23

Vous pouvez utiliser le HttpContext:

filterContext.HttpContext.Items["criteria"] = criteria;

Et vous pouvez le lire dans l'action:

[YourActionFilter]
public ActionResult SomeAction() 
{
    var criteria = HttpContext.Items["criteria"] as DetachedCriteria;
}
36
répondu Darin Dimitrov 2016-01-04 18:37:37

Définissez l'élément dans ViewData ou d'un viewmodel si vous le transmettez en tant que paramètre dans votre action. Ici, je définis la propriété D'un 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;
}

Voici la version non typée que je pense que vous préférez:

   public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.Controller.ViewData.Add("TestValue", "test");

    }

       [FilterWhichSetsValue]
        public ActionResult About()
        {
            string test = (string)ViewData["TestValue"];
            return View();
        }
3
répondu Mathias F 2016-01-04 18:37:31