objeto ASP.NET MVC passagem do filtro ação personalizada para Ação
-
05-07-2019 - |
Pergunta
Se eu criar um objeto em um filtro de ação personalizada no ASP.NET MVC no
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
DetachedCriteria criteria = DetachedCriteria.For<Person>();
criteria.Add("stuff");
// Now I need to access 'criteria' from the Action.....
}
Existe alguma maneira eu pode acessar o objeto da ação que está atualmente em execução.
Solução
Eu recomendaria colocá-lo nos dados de rota.
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();
}
Outras dicas
O melhor abordagem é descrito por Phil Haack.
Basicamente é isso que você faz:
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");
}
}
A única pegadinha é que, se você está criando parâmetros de objeto, em seguida, sua classe (neste caso Person) deve ter um construtor padrão, caso contrário você terá uma exceção.
Veja como você pode usar o filtro acima:
[AddActionParameter]
public ActionResult Index(int number, Person person)
{
// Now you can use number and person variables.
return View();
}
Você pode usar o HttpContext
:
filterContext.HttpContext.Items["criteria"] = criteria;
E você pode lê-lo na ação:
[YourActionFilter]
public ActionResult SomeAction()
{
var criteria = HttpContext.Items["criteria"] as DetachedCriteria;
}
conjunto de itens em ViewData ou de um viewmodel se você passá-lo como um parâmetro em sua ação. Aqui eu definir a propriedade de um 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;
}
Aqui é a versão untyped Eu acho que você prefere:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.Controller.ViewData.Add("TestValue", "test");
}
[FilterWhichSetsValue]
public ActionResult About()
{
string test = (string)ViewData["TestValue"];
return View();
}