Asp.net mvc - доступ к модели представления из пользовательского фильтра действий - PullRequest
35 голосов
/ 16 мая 2009

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

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

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

    sitemap.SetCurrentNode(model.Name);
}

Любой совет?

Ответы [ 5 ]

55 голосов
/ 16 мая 2009

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

filterContext.Controller.ViewData.Model
19 голосов
/ 11 августа 2014

Я не знаю почему, но 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);
    }
}
2 голосов
/ 12 января 2017

В .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, 
    }
1 голос
/ 05 февраля 2019

Выполнение вызова base.OnActionExecuted() в последней строке метода решило для меня проблему «Модель является нулем».

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

1 голос
/ 17 ноября 2015

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

enter image description here

...