2015-05-25 15 views
5

Ich versuche, einen ActionFilter in Aspnet vNext zu erstellen. Innerhalb dieses Filters möchte ich die TempData und der Viewdata (in früheren Versionen sowohl in Controller) für den Zugriff auf .I die Methode überschreiben public override void OnActionExecuting(ActionExecutingContext filterContext)aspnet vNext ActionFilter und TempData

In den filterContext ich den Controller, sondern ist ein object statt ControllerBase. Ich wurde eine ControllerBase erwartet, weil in früheren Versionen von MVC ControllerContext (die Basisklasse von ActionExecutingContext) war ControllerBase, here ist der Quellcode in Codeplex. Ich verstehe, dass dies an den POCO-Controllern liegen könnte.

Also, die Frage ist, wie Zugriff auf die TempData und die ViewData, wenn der Controller ein Objekt ist. Mach einfach einen downcasting (so etwas wie (Controller)filterContext.Controller) oder es gibt einen besten Weg es zu tun.

aktualisieren

Dass ich es in this blog post wenn erklären erreichen wollen, aber mit aspnet 5.

+1

Können Sie weitere Informationen geben, was ist das Szenario, das Sie erreichen wollen? Auf 'TempData' kann über den Dienst 'ITempDataDictionary' von DI aus zugegriffen werden. In Bezug auf 'ViewData' hängt es wahrscheinlich von dem Szenario ab ... wenn Sie die Anfrage kurzschließen, dann können Sie' ViewDataDictionary' selbst neu erstellen und die 'ViewData' -Eigenschaft beispielsweise auf ein' ViewResult' setzen. Oder wenn Sie nur Daten zu den 'ViewData' hinzufügen möchten, zu denen die Aktion eines Controllers mehr Daten hinzufügt, dann glaube ich, dass Casting einfach in Ordnung ist. –

+0

Ich möchte Daten setzen, um später bei der nächsten Anfrage zu bekommen. Als konkretes Beispiel möchte ich dasselbe erreichen, wie es in [diesem Blogbeitrag] erklärt wird (http://benfoster.io/blog/automatic-modestate-validation-in-aspnet-mvc). Ich werde diese Informationen in der Frage hinzufügen. – vfabre

+0

@KiranChalla, ich denke, dass Ihr Kommentar der Antwort auf meine Frage ist.Ich werde die Abhängigkeitsinjektion verwenden. Könnten Sie bitte als Antwort posten? – vfabre

Antwort

6

Um TempData Zugriff aus einem Action-Filter können Sie den Service erhalten ITempDataDictionary von DI genannt .

Um diesen Service von DI zu erhalten, können Sie entweder actionContext.HttpContext.RequestServices.GetRequiredService<ITempDataDictionary>() aus Ihrer OnActionExecuting Methode heraus tun. Sie können Construction inject auch verwenden, wenn Sie möchten ServiceFilterAttribute.

HINWEIS:
TempData standardmäßig Session Funktion hängt (das heißt TempData der Daten in Session gespeichert) und so müssen Sie einige Dinge, die es zum Laufen zu bringen.

  • Referenz Microsoft.AspNet.Session und Microsoft.Framework.Caching.Memory Pakete.

  • In Ihrem ConfigureServices Verfahren Sie wie folgt vor:

    services.AddCaching(); 
    services.AddSession(); 
    
  • In Ihrem Configure Methode, registrieren die Session Middleware (das ist die eine, die erstellt/fügt an eine Sitzung zu den eingehenden Anfragen) und es tun vor Registrierung MVC.

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