views:

4448

answers:

5

I get an error when I do the following:

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

The error i get is this:

Object reference not set to an instance of an object.

Why is this? I always check my session this way? I am using the MVC Framework, does this has something to do with it?

EDIT:

The code is in the constructor of a Controller:

public class MyController : ControllerBase
{
    private int mVar;

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

You'll have to do it like this-

if(null != HttpContext.Current.Session["Value"])
{
    //Code here.
}
Kirtan
'System.Web.HttpContextBase' does not contain a definition for 'Current' and no extension method 'Current' accepting a first argument of type 'System.Web.HttpContextBase' could be found (are you missing a using directive or an assembly reference?)
Martijn
When i leave the Current object, it does work. But I still get the error. I think it has something to do with what Partario says: The Session object itself is null. Now lat's foound out why :S...
Martijn
A: 

You're getting this error because the "Session" object is null. Therefore it's impossible to look at the ["value"] bit of it. I'm not familiar with MVC, but either there's a bigger problem whereby the Session object isn't being created, or you're accessing it at the wrong point of the lifecycle, or you just need a test to check if Session != null.

Graham Clark
+3  A: 

The [] is an indexer, it acts like a method on the class.

In this case, Session is null and you cannot perform the indexing on it.

Do this:

if(Session != null && Session["value"] != null)
{
   // code
}
Nick Whaley
+5  A: 

The session only really exists during the processing of an action - I wouldn't expect it to be valid in the constructor of a controller. For example, the controller might (for all I know) be re-used between requests.

You will need to do this either in the action (method), or (perhaps more appropriately) in an action filter, or the OnActionExecuting (etc) method(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
    }
}
Marc Gravell
Thnx. But why do i need to use filterContext.RequestContext.HttpContext.Session["val"] instead of Session["val"] ? And do i still need to invoke base.OnActionExecuting(filterContext);?
Martijn
Actually, you probably can - I'll edit.
Marc Gravell
Okay :) Can you tell me briefly what filterContext is about?
Martijn
That is just the way that it passes additional state (not normally directly available in members) to the filter methods. IIRC, it is mentioned a bit more in ASP.NET MVC In Action (Manning).
Marc Gravell
Thnx for the help :)
Martijn
What book can you recommend me for learning MVC?
Martijn
Erm... ASP.NET MVC In Action, as already mentioned. There are others, though.
Marc Gravell
A: 

The syntax used by you:

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

}

... is the correct way to check for a Session object in ASP.NET. I suspect that the problem is because you are using ASP.NET MVC.

Maybe some of our MVC experts can enlighten us as to the correct way of doing this in ASP.NET MVC.

Edit: I see that Marc Gravell has posted his answer while I'm typing this. That should be illuminatory.

Cerebrus