net mvc filters attribute asp asp.net-mvc filter custom-action

asp.net-mvc - mvc - filter attribute c#



Objeto ASP.NET MVC Pass desde Custom Action Filter hasta Action (4)

Si creo un objeto en un filtro de acción personalizado en ASP.NET MVC en

public override void OnActionExecuting(ActionExecutingContext filterContext) { DetachedCriteria criteria = DetachedCriteria.For<Person>(); criteria.Add("stuff"); // Now I need to access ''criteria'' from the Action..... }

¿Hay alguna forma de que pueda acceder al objeto desde la Acción que se está ejecutando actualmente?


Yo recomendaría ponerlo en los datos de ruta.

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


El mejor enfoque lo describe Phil Haack.

Básicamente esto es lo que haces:

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

El único problema es que si está creando parámetros de objetos, entonces su clase (en este caso, Persona) debe tener un constructor predeterminado, de lo contrario obtendrá una excepción.

A continuación, le mostramos cómo usaría el filtro anterior:

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


Establezca el elemento en ViewData o en un modelo de vista si lo pasa como un parámetro en su acción. Aquí establezco la propiedad de 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; }

Aquí está la versión sin tipo que creo que prefieres:

public override void OnActionExecuting(ActionExecutingContext filterContext) { filterContext.Controller.ViewData.Add("TestValue", "test"); } [FilterWhichSetsValue] public ActionResult About() { string test = (string)ViewData["TestValue"]; return View(); }


Puedes usar el HttpContext :

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

Y puedes leerlo en la acción:

[YourActionFilter] public ActionResult SomeAction() { var criteria = HttpContext.Items["criteria"] as DetachedCriteria; }