Asp.net mvc – доступ к модели представления из пользовательского фильтра действий
-
22-08-2019 - |
Вопрос
Я пытаюсь получить доступ к данным модели, переданным в представление в фильтре действий 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,
}
Создание base.OnActionExecuted()
вызов последней строки метода решил для меня проблему «Модель равна нулю».
(Это комментарий к ответу @Steven Lyons, но я публикую его как ответ, потому что не могу комментировать.)
Если вы получаете ноль - в качестве альтернативы ответу @Gustavo Clemente вы можете попробовать переопределить OnActionExecuted
и передать вашу модель представления следующим образом:
Действие:
[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);
}
}