2009-04-17 7 views
16

ottengo un errore quando effettuano le seguenti operazioni:C# Impossibile controllare la sessione esiste?

if(Session["value"] != null) 
{ 
    // code 
} 

L'errore che ottengo è questo:

riferimento non impostato a un'istanza di un oggetto.

Perché è questo? Controllo sempre la mia sessione in questo modo? Sto usando MVC Framework, ha qualcosa a che fare con questo?

EDIT:

Il codice è nel costruttore di un controllore:

public class MyController : ControllerBase 
{ 
    private int mVar; 

    public MyController() 
    { 
     if (Session["value"] != null) 
     { 
      mVar= (int)Session["value"]; 
     } 
    } 
} 
+0

vedo un potenziale problema qui con il modo in cui si controlla il valore di sessione.Dovresti averlo come "var myvar = Session [" value "];" Quindi controlla se è nullo e restituiscilo. Esiste la possibilità che la sessione diventi non valida tra il controllo e la trasmissione. - Ho solo pensato che dovresti saperlo :) – TWith2Sugars

+0

Thnx per il suggerimento :) – Martijn

+0

Non hai bisogno di 'var myvar = Session [" value "]; if (myvar! = null) ... 'come' if (Session ["value"]! = null) 'funzionerà bene. Inoltre non mi preoccuperei di ottenere 'Session [" value "]' due volte (una volta per! = Null e una volta per impostare la variabile) come l'ottimizzatore dovrebbe occuparsi di questo. Nota: potresti trovare il [?? operator] (http://msdn.microsoft.com/en-us/library/ms173224.aspx) utile: 'mVar = (int) Sessione [" valore "] ?? 0; '. Questo non risolverà il problema Session null di cui parla questo thread (poiché non sta controllando Session ma il valore da Session). – Trisped

risposta

18

La sessione esiste veramente solo durante la lavorazione di un'azione - non mi aspetto che sia valida nel costruttore di un controller. Ad esempio, il controller potrebbe (per quanto ne so) essere riutilizzato tra le richieste.

Sarà necessario eseguire questa operazione nell'azione (metodo), o (forse più appropriato) in un filtro azione o il metodo OnActionExecuting (etc) (s):

public abstract class ControllerBase : Controller 
{ 
    protected override void OnActionExecuting(
     ActionExecutingContext filterContext) 
    { 
     // code involving this.Session // edited to simplify 
     base.OnActionExecuting(filterContext); // re-added in edit 
    } 
} 
+1

Thnx. Ma perché ho bisogno di usare filterContext.RequestContext.HttpContext.Session ["val"] invece di Session ["val"]? E devo ancora invocare base.OnActionExecuting (filterContext) ;? – Martijn

+0

In realtà, probabilmente lo puoi fare - lo modifico. –

+1

Okay. Puoi dirmi brevemente di cosa tratta FilterContext? – Martijn

2

dovrete farlo come questo-

if(null != HttpContext.Current.Session["Value"]) 
{ 
    //Code here. 
} 
+0

'System.Web.HttpContextBase' non contiene una definizione per 'Corrente' e nessun metodo di estensione 'Corrente' che accetta un primo argomento di tipo 'System.Web.HttpContextBase' potrebbe essere trovato (ti manca una direttiva using o un assembly riferimento?) – Martijn

+0

Quando esco dall'oggetto Current, funziona. Ma ho ancora l'errore. Penso che abbia qualcosa a che fare con ciò che dice Partario: l'oggetto Session stesso è nullo. Ora lat's foound out perché: S ... – Martijn

+0

Funziona così: System.Web.HttpContext.Current.Session ["Value"] –

2

Stai ricevendo questo errore perché l'oggetto "Session" è nullo. Pertanto è impossibile guardare il ["valore"] bit di esso. Non ho familiarità con MVC, ma o c'è un problema più grande per cui l'oggetto Session non viene creato, o lo stai accedendo nel punto sbagliato del ciclo di vita, o hai solo bisogno di un test per verificare se Session! = nullo.

21

Il [] è un indicizzatore, si comporta come un metodo sulla classe.

In questo caso, Session è nullo e non è possibile eseguire l'indicizzazione su di esso.

fare questo:

if(Session != null && Session["value"] != null) 
{ 
    // code 
} 
+0

Questo mi ha aiutato. –

+0

Grazie. Ha perfettamente senso. Ho imparato qualcosa oggi! – mrwienerdog

+1

+1. Questa è la risposta corretta – arserbin3

1

La sintassi utilizzata da voi:

if (Session["mySessionVariable"] != null) 
{ 

} 

... è il modo corretto per verificare la presenza di un oggetto Session in ASP.NET. Sospetto che il problema sia dovuto al fatto che stai usando ASP.NET MVC.

Forse alcuni dei nostri esperti MVC possono illuminarci sul modo corretto di farlo in ASP.NET MVC.

Modifica: Vedo che Marc Gravell ha pubblicato la sua risposta mentre sto digitando questo. Questo dovrebbe essere illuminante.

1

risolvo in questo modo:

if (Session.Count > 0 && Session["mySessionVariable"].ToString() != null) 
{ 

} 
+1

Would not 'if (Session! = Null 0 && Session [" mySessionVariable "]! = Null)' funziona meglio? – Trisped

+3

-1 Questo genera un errore se la tua sessione è effettivamente nullo. –

1
if(Session != null && Session["name"] != null && Session["name"].ToString()!="") 
{ 
    //fire code 
} 
0

È inoltre possibile utilizzare:

if (Session == null || String.IsNullOrEmpty((string)Session["session_object"])){ 
    // Do something 
}