65 votes

Objet ASP.NET MVC passé du filtre d'action personnalisée à action

Si je crée un objet dans un filtre d'action personnalisée dans 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?

62voto

niaher Points 2708

La meilleure approche est décrite par Phil Haack.

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

La seule chose à corriger, c'est que si vous créez les paramètres de l'objet, puis votre classe (dans ce cas Personne) doit avoir un constructeur par défaut, sinon vous obtiendrez une exception.

Voici comment vous pouvez utiliser ce filtre:

[AddActionParameter]
public ActionResult Index(int number, Person person)
{
    // Now you can use number and person variables.
    return View();
}

Je suis "un peu" trop tard pour le parti, mais ce OMI est une belle approche.

53voto

Chad Moran Points 8560

Je recommanderais de le mettre dans les données de la 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();
    }
 

39voto

Darin Dimitrov Points 528142

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

3voto

Malcolm Frexner Points 5393

Définissez l'élément dans ViewData ou d'un modèle de vue si vous le transmettez en tant que paramètre à 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;
}
 

EDIT Voici la version non typée, 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();
        }
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X