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

StackOverflow https://stackoverflow.com/questions/872796

Вопрос

Я пытаюсь получить доступ к данным модели, переданным в представление в фильтре действий 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);
    }
}

enter image description here

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top