net mvc filters asp c# asp.net-mvc custom-action-filter

c# - mvc - net core authorization filter



Asp.net mvc: acceder al modelo de vista desde un filtro de acción personalizado (4)

El modelo está en:

filterContext.Controller.ViewData.Model

Estoy intentando acceder a los datos del Modelo pasados ​​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?


En .Net Core tienes ActionArguments IDictionary en el contexto, con todos los parámetros de tu método

Entonces, si tienes el siguiente método de control

[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, }


No sé por qué, pero filterContext.Controller.ViewData.Model siempre es nulo, incluso cuando el enlace del modelo se ejecuta antes de OnActionExecuted . Encontré una solución usando el evento OnModelUpdated para establecer esa propiedad antes.

Tengo la carpeta 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 eso, debe establecer el enlazador predeterminado para su nuevo archivador modelo en la sección Application_Start() en Global.asax:

ModelBinders.Binders.DefaultBinder = new CustomModelBinder();

Finalmente, puede acceder a su Model en ActionFilterAttribute :

public class TraceLog : ActionFilterAttribute { public override void OnActionExecuted(ActionExecutedContext filterContext) { //filterContext.Controller.ViewData.Model now isn''t null base.OnActionExecuted(filterContext); } }


Si obtiene nulo: como alternativa a la respuesta de @Gustavo Clemente, puede intentar sobrescribir OnActionExecuted y pasar su viewModel a la vista de la siguiente manera:

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