Asp.net mvc - Acceder a la vista de Modelo a partir de una Acción personalizada de filtro
-
22-08-2019 - |
Pregunta
Estoy tratando de acceder a los datos del Modelo pasa a la vista en el filtro de acción OnActionExecuted.¿Alguien sabe si esto es posible?
Estoy tratando de hacer algo como esto:
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
//get model data
//...
sitemap.SetCurrentNode(model.Name);
}
Algún consejo?
Solución
El modelo se encuentra en:
filterContext.Controller.ViewData.Model
Otros consejos
No sé por qué, pero filterContext.Controller.ViewData.Model
siempre es NULL, incluso cuando se ejecuta el modelo se unen antes de OnActionExecuted
. He encontrado una solución mediante el OnModelUpdated
evento para establecer que la propiedad antes.
Tengo el aglutinante modelo:
public class CustomModelBinder: DefaultModelBinder
{
protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
controllerContext.Controller.ViewData.Model = bindingContext.Model;
base.OnModelUpdated(controllerContext, bindingContext);
}
}
Después de que usted necesita para configurar el enlazador predeterminado a su nuevo modelo de ligante en la sección Application_Start()
en Global.asax:
ModelBinders.Binders.DefaultBinder = new CustomModelBinder();
Por último, puede acceder a su Model
en un ActionFilterAttribute
:
public class TraceLog : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
//filterContext.Controller.ViewData.Model now isn't null
base.OnActionExecuted(filterContext);
}
}
En .Net Core tiene un IDictionary ActionArguments del contexto, con todos los parámetros de su método
Así que si usted tiene el siguiente método controlador
[HttpPost]
public void Post([FromBody]BaseRequest request)
{
}
Puede acceder al campo como tal
public override void OnActionExecuting(ActionExecutingContext context)
{
var request = context.ActionArguments["request"] as BaseRequest;`
//do whatever,
}
Hacer la base.OnActionExecuted()
llamar a la última línea del método resolvió el 'ser modelo nulo' problema para mí.
(Este es un comentario a la respuesta @Steven Lyons 's, pero estoy publicar como una respuesta porque no puedo comentar.)
Si usted está recibiendo null - como alternativa a @Gustavo Clemente de la respuesta que usted puede tratar de reemplazar OnActionExecuted
y pasando su viewModel a la vista en la siguiente forma:
Acción:
[Breadcrumb("Index")]
public ActionResult UnitIndex()
{
View(new Answers());
}
Atributo:
public class BreadcrumbAttribute : ActionFilterAttribute
{
public string Page { get; set; }
public BreadcrumbAttribute(string page)
{
Page = page;
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
var model = (IBreadcrumbs)filterContext.Controller.ViewData.Model;
model.Breadcrumbs = BreadcrumbHelper.GetBreadCrumbs(string.Format("{0}", filterContext.RouteData.DataTokens["area"]), Page);
}
}