2009-03-01 11 views
3

Ich möchte Zugriff auf den aktuellen ausführenden Controller erhalten, damit ich die Rückgabe des entsprechenden ActionResult auf eine Hilfsmethode entladen kann. Zu diesem Zweck suche ich nach dem Äquivalent von dem, was ich ControllerContext.Current hätte gedacht haben wäre aber nicht. Vielen Dank!Controller-Äquivalent von HttpContext.Current in ASP.NET MVC

Zur Klärung bearbeiten: Ich habe eine generische Formularsteuerung, die JavaScript-basiert ist, aber ich möchte eine Option hinzufügen, so dass es mit Noscript funktioniert. Momentan setzt mein Controller das ViewData.Model auf ein JSON-ified Models.FormResponse <T>.

Diese FormReponse wird mit dem Status der Post und alle Fehlermeldungen, die generiert wurden eingerichtet, so möchte ich eine GetActionResult() -Methode, die die Skript/Noscript-Überprüfung (eine versteckte Formulareingabe) und entweder:

  1. Setzt das Modell mit dem JSONed FormResponse und gibt einen Blick() oder
  2. Serialisiert das FormResponse in die Session und gibt ein Redirect().

Da dies ändert sich offensichtlich den Rückgabewert, und ich will mich nicht tun, jedes Mal, das überprüfen, ich brauche Ansicht anrufen oder vom GetActionResult des FormResponse Redirect-Methode, um dies zu nennen wie:

return formResponse.GetActionResult(); 

Ich weiß mit einem mehr Astronautik-Design könnte dies noch robuster gemacht werden, aber wie die Noscript-Option ist kein Hauptmerkmal im Moment, ich brauche nur eine schnelle Lösung arbeiten, die andere Dinge nicht bricht.

Update # 2

Die folgende, in einer Action Klasse implementiert, macht den Job für mich. Danke CVertex!

public override void ExecuteResult(ControllerContext context) 
    { 
     if (CMSEnvironment.NoScript) 
     { 
      Oracle.Response.Redirect(Oracle.Request.UrlReferrer.ToString(), true); 
     } 

     context.Controller.ViewData.Model = _model.ToJSON(); 

     new ViewResult() 
     { 
      ViewName = Areas.Site.Helpers.SharedView.Service, 
      ViewData = context.Controller.ViewData 
     }.ExecuteResult(context); 
    } 
+0

Wo möchten Sie diesen Zugang, aus Ihrer Sicht? –

+0

Was ist eine generische Formularsteuerung? Ist es ein ViewUserControl ? – CVertex

Antwort

4

Statik ist schlecht für die Testbarkeit, und in MVC wird sehr abgeraten.

Warum möchten Sie auf den aktuellen Controller und die Aktionsmethode zugreifen?

Der beste Weg, dies zu tun ist implement your own ActionFilter. Dies ermöglicht Ihnen das Abfangen von Anfragen vor oder nach dem Ausführen von Aktionsmethoden.

EDIT: Durch Abfangen des Ergebnisses in OnActionExecuted eines Filters können Sie Ihre Noscript/Skript-Prüfungen durchführen und Ihre ViewData entsprechend für den Verbrauch durch die Ansicht ändern. Inside OnActionExecuted können Sie auch die Noscript-Prüfung durchführen und die vollständige Kontrolle über das endgültige ActionResult oder die ViewData haben, wie Sie möchten.

Oder Sie können Ihr eigenes ActionResult schreiben, das all diese Entscheidungen trifft. Ihre Controller-Aktion also letztlich tut

return new MyActionResult(format_and_view_agnostic_model_object); 
1

Es ist kein Weg zu sein scheint mit dem aktuellen Controller von einem Thread zu navigieren. Das heißt, Sie können den ControllerBuilder abrufen, und Sie können den MvcHttpHandler abrufen, aber keiner von beiden lässt Sie dann auf die Controller-Instanz zugreifen, die der Handler verwendet.