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