Pregunta

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 acceder al objeto desde la Acción que se está ejecutando actualmente.

¿Fue útil?

Solución

Recomendaría ponerlo en los datos de la 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();
    }

Otros consejos

El mejor enfoque es descrito por 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 objeto, entonces su clase (en este caso, Persona) debe tener un constructor predeterminado, de lo contrario obtendrá una excepción.

Así es como usarías el filtro anterior:

[AddActionParameter]
public ActionResult Index(int number, Person person)
{
    // Now you can use number and person variables.
    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;
}

Establezca un elemento en ViewData o de un modelo de vista si lo pasa como un parámetro a 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();
        }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top