Я не знаю, почему, но filterContext.Controller.ViewData.Model
всегда нуль, даже если модель привязки выполняется перед OnActionExecuted
. Я нашел решение, используя событие OnModelUpdated
, чтобы установить это свойство раньше.
У меня есть модель связующего:
public class CustomModelBinder: DefaultModelBinder
{
protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
controllerContext.Controller.ViewData.Model = bindingContext.Model;
base.OnModelUpdated(controllerContext, bindingContext);
}
}
После этого вам необходимо установить связующее по умолчанию для вашей новой модели связующего в Application_Start()
секции в Global.asax:
ModelBinders.Binders.DefaultBinder = new CustomModelBinder();
Наконец, вы можете получить доступ к ваш Model
в ActionFilterAttribute
:
public class TraceLog : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
//filterContext.Controller.ViewData.Model now isn't null
base.OnActionExecuted(filterContext);
}
}
Это всегда null :( – Korayem
@Korayem - зависит от того, как рано вы пытаетесь получить к нему доступ. Если вы получите его после выполнения действия контроллера, он должен быть экземпляром viewmodel. – JBeckton
Это значение null для меня во всех методах (OnActionExecuting, OnActionExecuted, OnResultExecuting, OnResultExecuted) –