Frage

Das kann nicht der richtige Weg sein Controller zu verwenden, aber ich habe dieses Problem bemerkt und hatte keinen Weg gefunden, ihn zu korrigieren.

public JsonResult SomeControllerAction() {

    //The current method has the HttpContext just fine
    bool currentIsNotNull = (this.HttpContext == null); //which is false    

    //creating a new instance of another controller
    SomeOtherController controller = new SomeOtherController();
    bool isNull = (controller.HttpContext == null); // which is true

    //The actual HttpContext is fine in both
    bool notNull = (System.Web.HttpContext.Current == null); // which is false        

}

Ich habe bemerkt, dass der Httpcontext auf einem Controller nicht die „eigentlichen“ ist Httpcontext, dass Sie in System.Web.HttpContext.Current finden würden.

Gibt es eine Möglichkeit, manuell die Httpcontextbase auf einem Controller zu füllen? Oder eine bessere Möglichkeit, eine Instanz eines Controller zu erstellen?

War es hilfreich?

Lösung

Controller nicht manuell erstellt werden so konzipiert, wie Sie tun. Es klingt wie das, was Sie sollten wirklich tun wird, was auch immer wiederverwendbare Logik, die Sie in eine Hilfsklasse haben setzen statt.

Andere Tipps

Für jetzt werde ich folgendes tun. Dies scheint eine akzeptable Lösung zu sein ...

public new HttpContextBase HttpContext {
    get {
        HttpContextWrapper context = 
            new HttpContextWrapper(System.Web.HttpContext.Current);
        return (HttpContextBase)context;                
    }
}

Wenn dies zu einer Controller-Klasse hinzugefügt wird dieser Controller von ererben.

Ich bin mir nicht sicher, ob die Httpcontext null ist das gewünschte Verhalten ist, aber das wird es in der Zwischenzeit für mich zu beheben.

Der Httpcontext, in dem Controller ist null, weil es nicht gesetzt ist, wenn der Controller erstellt wird. Der contructor des Controllers nicht zuweisen diese Eigenschaft nicht, so ist der Wert null. Normalerweise wird der Httpcontext auf die Httpcontext der ControllerBuilder Klasse. Controller werden von der ControllerBuilder Klasse erstellt, von der DefaultControllerFactory gefolgt. Wenn Sie möchten, dass Ihre eigene Instanz von einem Controller erstellen, können Sie die ExecuteMethod des Controllers mit dem eigenen Controller verwenden. Sie wollen nicht zu tun, dass eine wirkliche Anwendung. Wenn Sie etwas mehr Erfahrung mit dem Framework erhalten Sie die geeignete Methode finden wollen Sie wollen. Wenn Sie Controller in Unit-Test benötigen, können Sie einen Mockframework verwenden, um die Controller zu verspotten oder Sie können es Klasse fälschen.

Sie können ein Modell des Anforderungsablauf in asp.net Mvc auf Blog .

Wenn Sie Ihre neue zu Asp.net Mvc, dann ist es die Mühe wert, den Quellcode herunterzuladen und ein Spur die Route zu lesen, wie eine Anforderung verarbeitet wird.

Ist es, dass Sie einige Funktionen von der Steuerung verwendet werden sollen? Oder hat die Steuerung eine Aktion durchführen?

Wenn es die früheren ist, vielleicht ist, dass einiger Code, der in einer anderen Klasse geteilt werden soll. Wenn es Letzteres ist, können Sie dies tun, um einfach, dass die Steuerung haben Sie eine bestimmte Aktion:


return RedirectToAction("SomeAction", "SomeOtherController", new {param1 = "Something" });

Verwenden Sie einen Controller Factory? Wenn ja, wie registrieren Sie Komponenten?

Ich lief in dieses Problem, wo ich versehentlich eine Httpcontext-basierte Abhängigkeit als Singleton hatte hinzugefügt, anstatt Transient in Windsor.

Httpcontext war null für alle, aber die erste Anfrage. Es dauerte eine Weile, dass man auf der Spur.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top