2009-05-16 13 views

Respuesta

51

El modelo se encuentra en:

filterContext.Controller.ViewData.Model 
+8

Siempre es nulo :( – Korayem

+4

@Korayem - depende de qué tan pronto lo intente y acceda a él. Si lo obtiene después de que se haya ejecutado la acción del controlador, debe ser una instancia del modelo de vista. – JBeckton

+8

Es nulo para mí en todos los métodos (OnActionExecuting, OnActionExecuted, OnResultExecuting, OnResultExecuted) –

18

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

que tienen el modelo de aglutinante:

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 se puede acceder 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); 
    } 
} 
1

Si está recibiendo nula - como alternativa a la respuesta de @Gustavo Clemente puede intentar anular OnActionExecuted y pasando el modelo de vista 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

+0

¿De dónde es este código? ¡Extrañamente estaba buscando una respuesta a esta pregunta específicamente en el contexto del cableado de una solución de migas de pan en un proyecto reciente! –

+0

@CrescentFresh Lo hice por una de las empresas .... –

2

En .Net núcleo que tienen un IDictionary ActionArguments del contexto, con todos los parámetros de su método de

Así que si usted tiene el siguiente método controlador

[HttpPost] 
    public void Post([FromBody]BaseRequest request) 
    { 
    } 

Puede acceder al campo al igual que

public override void OnActionExecuting(ActionExecutingContext context) 
    { 
     var request = context.ActionArguments["request"] as BaseRequest;` 
     //do whatever, 
    } 
Cuestiones relacionadas