2015-07-13 10 views
6

Ich habe eine ASP.NET MVC App und ich fügte einen neuen Controller hinzu und rufen Sie eine Methode von diesem neuen Controller von einem vorhandenen Controller. Ich bin mit Session-Variablen und in der Steuerung A nennen ich die Methode in die Steuerung B:Sitzung ist null, wenn Methode von einem Controller zu einem anderen aufgerufen wird ... MVC

if (Session["Grid"] != null){}//session object is fine here 
     ControllerB b = new ControllerB(); 
b.CallMethod(); 

Im neuen Controller, der iB bin Aufruf, sieht das Verfahren wie folgt aus:

public object CallMethod(){ 
    if (Session["Grid"] != null)//session object is null 
     { 
      //do my thing 
     } 
    } 

Die Sitzungsvariable ist nicht das Problem, es ist das Sitzungsobjekt. Es ist absolut null, daher ist meine Bewerbung in die Luft gegangen. Die Sitzung ist in Controller A lebendig und gut, warum ist es in Controller B also null? Vielen Dank

Antwort

11

Das ist, weil ControllerB selbst zu initialisiert braucht, und als Teil dieses Prozesses setzt auch Session, Request, Resposne usw. entsprechend.

So müssen Sie die Initialize Methode aufrufen und übergeben Sie die aktuelle RequestContext. Aber da ist es als protected markiert (weil es nicht direkt aufgerufen werden gemeint war, nur die ControllerFactory verwendet wird), werden Sie es aussetzen müssen:

public class ControllerB : Controller 
{ 
    public void InitializeController(RequestContext context) 
    { 
     base.Initialize(context); 
    } 
} 

Dann in Ihrem ControllerA:

var controllerB = new ControllerB(); 
controllerB.InitializeController(this.Request.RequestContext); 

Alternativ kann, da die Session Getter eigentlich eine Abkürzung für this.ControllerContext.HttpContext.Session (gleich für Request, Response usw.) ist, können Sie die ControllerContext stattdessen setzen:

var controllerB = new ControllerB(); 
controllerB.ControllerContext = new ControllerContext(this.Request.RequestContext, controllerB); 

Siehe MSDN

+0

Hallo haim770 - das ist, was ich gesucht habe. Vielen Dank – BoundForGlory

1

Dies geschieht, weil Session eine Eigenschaft ist, die auf der Grundlage, wie der Controller aufgerufen wird, unterschiedlich ist.

Anstelle von Session können Sie HttpContext.Session verwenden. HttpContext bezieht sich auf die aktuelle http-Anfrage.

public object CallMethod(){ 
    if (HttpContext.Session["Grid"] != null)//session object is null 
    { 
     //do my thing 
    } 
} 
1

Dies wird durch die gute Codierung der Praxis leicht fixiert „sagen, fragen Sie nicht“, dh Sie den gewünschten Wert in die Methode übergeben, anstatt es zu erwarten, denn es für sich selbst zu gehen auf der Suche :

if (Session["Grid"] != null) 
{ 
    var b = new ControllerB(); 
    b.CallMethod(Session["Grid"]); 
} 

... 
public object CallMethod(string grid) 
{ 
    //do your thing 
} 
Verwandte Themen