web-dev-qa-db-fra.com

ASP.NET MVC Pass object from Custom Action Filter to Action

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

}

existe-t-il un moyen d'accéder à l'objet à partir de l'action en cours d'exécution.

64
reach4thelasers

Je recommanderais de le mettre dans les données d'itinéraire.

    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();
    }
53
Chad Moran

Le meilleure approche est décrit 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 problème 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 utiliser le filtre ci-dessus:

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

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;
}
39
Darin Dimitrov

Définissez l'élément dans ViewData ou dans un modèle de vue si vous le transmettez en tant que paramètre à votre action. Ici, je définit 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
Mathias F