Ответ 1
Модель находится по адресу:
filterContext.Controller.ViewData.Model
Я пытаюсь получить доступ к данным модели, переданным в представление в фильтре действий OnActionExecuted. Кто-нибудь знает, возможно ли это?
Я пытаюсь сделать что-то вроде этого:
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
//get model data
//...
sitemap.SetCurrentNode(model.Name);
}
Любые советы?
Модель находится по адресу:
filterContext.Controller.ViewData.Model
Я не знаю, почему, но filterContext.Controller.ViewData.Model
всегда равно null, даже когда привязка модели выполняется до 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);
}
}
В .Net Core у вас есть контекст ActionArguments IDictionary со всеми параметрами вашего метода
Так что если у вас есть следующий метод контроллера
[HttpPost]
public void Post([FromBody]BaseRequest request)
{
}
Вы можете получить доступ к полю, как так
public override void OnActionExecuting(ActionExecutingContext context)
{
var request = context.ActionArguments["request"] as BaseRequest;'
//do whatever,
}
Если вы получаете нуль - как альтернатива ответу @Gustavo Clemente, вы можете попробовать переопределить OnActionExecuted
и передать свой viewModel в виде следующим образом:
Действие:
[Breadcrumb("Index")]
public ActionResult UnitIndex()
{
View(new Answers());
}
Атрибут
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);
}
}
Выполнение base.OnActionExecuted()
для последней строки метода решило для меня проблему "Model base.OnActionExecuted()
null".
(Это комментарий к ответу @Steven Lyons, но я публикую его как ответ, потому что не могу комментировать.)