Подтвердить что ты не робот

Asp.net mvc - доступ к представлению модели из пользовательского фильтра действий

Я пытаюсь получить доступ к данным модели, переданным в представление в фильтре действий OnActionExecuted. Кто-нибудь знает, возможно ли это?

Я пытаюсь сделать что-то вроде этого:

public override void OnActionExecuted(ActionExecutedContext filterContext)
{
    //get model data
    //...

    sitemap.SetCurrentNode(model.Name);
}

Любые советы?

4b9b3361

Ответ 1

Модель находится по адресу:

filterContext.Controller.ViewData.Model

Ответ 2

Я не знаю, почему, но 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);
    }
}

Ответ 3

В .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, 
    }

Ответ 4

Если вы получаете нуль - как альтернатива ответу @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);
    }
}

введите описание изображения здесь

Ответ 5

Выполнение base.OnActionExecuted() для последней строки метода решило для меня проблему "Model base.OnActionExecuted() null".

(Это комментарий к ответу @Steven Lyons, но я публикую его как ответ, потому что не могу комментировать.)