Asp.net mvc - Acceder a la vista de Modelo a partir de una Acción personalizada de filtro

StackOverflow https://stackoverflow.com/questions/872796

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?

¿Fue útil?

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

enter image description here

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top