Question

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.....

}

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

Était-ce utile?

La solution

Je recommanderais de l'insérer dans les données de l'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();
    }

Autres conseils

La meilleure approche est décrite par Phil Haack.

En gros, voici 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 piège est que si vous créez des paramètres d'objet, votre classe (dans ce cas, Personne) 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();
}

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

Définissez un é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;
}

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();
        }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top