2015-05-25 4 views
5

Я пытаюсь создать ActionFilter в aspnet vNext. В этом фильтре я хочу, чтобы получить доступ к TempData и ViewData (оба имеющихся в контроллере в предыдущих версиях) .И переопределить метод public override void OnActionExecuting(ActionExecutingContext filterContext)aspnet vNext ActionFilter и TempData

в filterContext у меня есть контроллер, но это object вместо ControllerBase. Я ожидал ControllerBase, потому что в предыдущих версиях MVC ControllerContext (базовый класс ActionExecutingContext) был ControllerBase, here является исходным кодом в кодеплексе. Я понимаю, что это может быть связано с контроллерами POCO.

Итак, вопрос в том, как получить доступ к TempData и ViewData, если контроллер является объектом. Просто делать downcasting (что-то вроде этого (Controller)filterContext.Controller), или есть лучший способ сделать это.

Update

То, что я хочу достичь, если объяснить это this blog post но с САШ 5.

+1

Можете ли вы дать больше информации относительно того, что сценарий, который вы пытаетесь достичь? Доступ к «TempData» можно получить через службу «ITempDataDictionary» от DI. Что касается 'ViewData', это, вероятно, будет зависеть от сценария ... если вы коротко замыкаете запрос, то вы можете самостоятельно создать' ViewDataDictionary' и установить свойство 'ViewData' на' ViewResult', например. Или, если вы хотите просто добавить данные в «ViewData», к которым действие контроллера добавляет больше данных, тогда я считаю, что отличное кастинг просто отлично. –

+0

Я хочу установить данные для последующего последующего запроса. В качестве конкретного примера я хочу достичь того же, что и объяснять это в [этом сообщении блога] (http://benfoster.io/blog/automatic-modelstate-validation-in-aspnet-mvc). Я собираюсь добавить эту информацию в вопрос. – vfabre

+0

@KiranChalla, я думаю, что ваш комментарий является ответом на мой вопрос.Я буду использовать инъекцию зависимостей. Не могли бы вы отправить сообщение в качестве ответа? – vfabre

ответ

6

Чтобы получить доступ TempData внутри фильтра действий, вы можете получить сервис под названием ITempDataDictionary от DI ,

Чтобы получить эту услугу от DI, вы можете сделать что-то вроде actionContext.HttpContext.RequestServices.GetRequiredService<ITempDataDictionary>() с точностью до OnActionExecuting. Вы также можете использовать конструкцию, если хотите, используя ServiceFilterAttribute.

Примечание:
TempData по умолчанию зависит от Session функции (данные TempData т.е. хранится в сессии), и поэтому вам нужно несколько вещей, чтобы получить его работу.

  • Reference Microsoft.AspNet.Session и Microsoft.Framework.Caching.Memory пакетов.

  • В вашем методе ConfigureServices, выполните следующие действия:

    services.AddCaching(); 
    services.AddSession(); 
    
  • В вашем методе Configure, зарегистрировать Session промежуточное программное обеспечение (это тот, который создает/присоединяет сессию входящих запросов), и сделать это до Регистрация MVC.

    app.UseSession(); 
    app.UseMvc(...) 
    
Смежные вопросы