2015-05-25 12 views
5

Próbuję utworzyć ActionFilter w aspnet vNext. W ramach tego filtra Chcę, aby uzyskać dostęp do TempData i ViewData (oba dostępne w kontrolerze w poprzednich wersjach) .I zastąpić metodę public override void OnActionExecuting(ActionExecutingContext filterContext)aspnet vNext ActionFilter i TempData

Into the filterContext Mam kontroler ale jest object zamiast ControllerBase. Oczekiwano mnie od ControllerBase, ponieważ w poprzednich wersjach MVC ControllerContext (podstawowa klasa ActionExecutingContext) był ControllerBase, here jest kodem źródłowym w codeplex. Rozumiem, że może to być spowodowane kontrolerami POCO.

Pytanie brzmi, jak uzyskać dostęp do TempData i ViewData, jeśli kontroler jest obiektem. Po prostu robi downcasting (coś podobnego do tego (Controller)filterContext.Controller) lub jest najlepszy sposób, aby to zrobić.

Aktualizacja

Że chcę osiągnąć, jeśli to wyjaśnić w this blog post ale z aspnet 5.

+1

Czy możesz podać więcej szczegółów, co jest scenariusz, który staramy się osiągnąć? Do 'TempData' można uzyskać dostęp poprzez usługę" ITempDataDictionary "z DI. Jeśli chodzi o 'ViewData', prawdopodobnie zależy to od scenariusza ... jeśli zwiążesz żądanie, możesz samodzielnie utworzyć' ViewDataDictionary' i na przykład ustawić właściwość 'ViewData' na' ViewResult'. Lub jeśli chcesz po prostu chcieć dodać dane do 'ViewData', do którego działanie kontrolera dodaje więcej danych, wtedy wierzę, że rzucanie w dół jest w porządku. –

+0

Chcę ustawić dane na później na następne żądanie. Jako konkretny przykład chcę osiągnąć to samo, co wyjaśniono w [tym blogu] (http://benfoster.io/blog/automatic-modelstate-validation-in-aspnet-mvc). Zamierzam dodać te informacje w pytaniu. – vfabre

+0

@KiranChalla, myślę, że twój komentarz jest anwser na moje pytanie.Będę używał wtrysku zależności. Czy możesz napisać odpowiedź jako odpowiedź? – vfabre

Odpowiedz

6

Aby uzyskać dostęp TempData od wewnątrz filtra działania, można uzyskać usługa nazywa ITempDataDictionary z DI .

Aby uzyskać tę usługę z DI, można wykonać polecenie takie jak actionContext.HttpContext.RequestServices.GetRequiredService<ITempDataDictionary>() z poziomu metody OnActionExecuting. Możesz także użyć konstrukcji inject, jeśli chcesz, używając ServiceFilterAttribute.

UWAGA:
TempData domyślnie zależy Session funkcji (dane tj TempData jest przechowywany w sesji), a więc trzeba kilka rzeczy, aby uzyskać jego pracy.

  • referencyjny Microsoft.AspNet.Session i Microsoft.Framework.Caching.Memory pakiety.

  • W swojej metodzie ConfigureServices, wykonaj następujące czynności:

    services.AddCaching(); 
    services.AddSession(); 
    
  • W swojej metodzie Configure, zarejestruj Session middleware (to jest ten, który tworzy/przywiązuje sesję dla przychodzących żądań) i zrób to przed rejestracją MVC.

    app.UseSession(); 
    app.UseMvc(...)