2015-07-13 7 views
6

Mam aplikację ASP.NET MVC i dodałem do niej nowy kontroler i wywołać metodę z tego nowego kontrolera z istniejącego kontrolera. Używam zmiennych sesji i kontroler A I wywołać metodę kontroler B:Sesja ma wartość null podczas wywoływania metody z jednego kontrolera do drugiego ... MVC

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

w nowym kontrolerem, który Dzwonię B, metoda wygląda następująco:

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

Zmienna sesji nie jest problemem, jest to obiekt sesji. Jest całkowicie zerowy, dlatego moje zgłoszenie wysadza się w powietrze. Sesja jest żywa i dobrze działa w kontrolerze A, więc dlaczego jest ona zerowa w kontrolerze B? Dziękujemy

Odpowiedz

11

To dlatego ControllerB musi inicjalizuje się, a jako część tego procesu to również ustawia Session, Request, Resposne etc odpowiednio.

Należy zatem wywołać metodę Initialize i przekazać ją bieżącemu RequestContext. Jednak, ponieważ jest oznaczone jako protected (bo nie miał być wywoływane bezpośrednio, tylko za pomocą ControllerFactory), będziesz musiał go wystawiać:

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

Następnie w ControllerA:

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

Alternatywnie, ponieważ Session getter jest właściwie skrótem this.ControllerContext.HttpContext.Session (taki sam dla Request, Response etc), można ustawić zamiast ControllerContext:

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

Zobacz MSDN

+0

Witaj haim770 - Tego właśnie szukałem. Dziękuję Ci bardzo – BoundForGlory

1

Dzieje się tak, ponieważ Session jest właściwością, która jest inicjowana inaczej w zależności od sposobu wywoływania kontrolera.

Zamiast Session można użyć HttpContext.Session. HttpContext odnosi się do bieżącego żądania http.

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

to łatwo ustalony przez dobrych praktyk kodowania z „powiedzieć, nie pytaj”, czyli przekazać żądaną wartość do metody, niż spodziewałem się, szukać go dla siebie :

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

... 
public object CallMethod(string grid) 
{ 
    //do your thing 
} 
Powiązane problemy