C#无法检查Session是否存在?

16

当我执行以下操作时,会出现错误:

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

我遇到的错误是:

对象引用未设置为对象的实例。

为什么会这样?我总是用这种方式检查我的session。我正在使用MVC框架,这是否与此有关?

编辑:

该代码位于控制器的构造函数中:

public class MyController : ControllerBase
{
    private int mVar;

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

我在这里看到一个潜在的问题,与您检查会话值的方式有关。您应该将其设置为“var myvar = Session [“value”];”,然后检查它是否为空并将其转换回来。在检查和转换之间,会话可能会变得无效。 - 只是想让您知道 :) - TWith2Sugars
你不需要使用 var myvar = Session["value"]; if(myvar != null)...,因为 if (Session["value"] != null) 也可以正常运行。我也不会担心获取 Session["value"] 两次(一次用于 != null,一次用于设置变量),因为优化器应该会处理这个问题。注意:你可能会发现 ?? 操作符 很有用:mVar= (int)Session["value"] ?? 0;。这将无法解决此线程讨论的空 Session 问题(因为它没有检查 Session 而是检查了来自 Session 的值)。 - Trisped
8个回答

21

方括号[]是索引器,它像类上的方法一样起作用。

在这种情况下,Session为空,因此您无法对其进行索引操作。

请这样做:

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

谢谢。非常清晰易懂。今天学到了一点东西! - mrwienerdog

18

会话只在动作的处理过程中真正存在 - 我不会期望它在控制器的构造函数中有效。例如,控制器可能在请求之间被重复使用。

您需要在动作(方法)中执行此操作,或者更适当地,在动作筛选器或OnActionExecuting等方法中进行:

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
谢谢。但是为什么我需要使用filterContext.RequestContext.HttpContext.Session["val"]而不是Session["val"]?我还需要调用base.OnActionExecuting(filterContext)吗? - Martijn
1
好的 :) 你能简要告诉我filterContext是关于什么的吗? - Martijn
这只是它将附加状态(通常不直接可用于成员)传递给过滤器方法的方式。如果我没记错的话,在《ASP.NET MVC实战》(Manning)中有更详细的说明。 - Marc Gravell
嗯...就像已经提到的那样,ASP.NET MVC在行动中。当然还有其他的。 - Marc Gravell
@MarcGravell http://stackoverflow.com/questions/17362072/checking-session-exists-or-not-mvc3 - Sharun

2
你需要这样做才行-
if(null != HttpContext.Current.Session["Value"])
{
    //Code here.
}

'System.Web.HttpContextBase'不包含名为'Current'的定义,也没有接受类型为'System.Web.HttpContextBase'的第一个参数的扩展方法'Current'可以找到(您是否缺少使用指令或程序集引用?) - Martijn
当我离开当前对象时,它确实起作用。但我仍然收到错误提示。我认为这与Partario所说的有关:会话对象本身为空。现在让我们找出原因:S... - Martijn
像这样做就可以了:System.Web.HttpContext.Current.Session["Value"] - t_plusplus

2
您看到这个错误是因为“Session”对象为空。因此,无法查看其中的[“value”]位。我不熟悉MVC,但可能存在更大的问题,即未创建Session对象,或者您在生命周期的错误点访问它,或者您只需要一个测试来检查Session!= null。

1
我是这样解决的:
if (Session.Count > 0 && Session["mySessionVariable"].ToString() != null)
{

}

1
if (Session != null 0 && Session["mySessionVariable"] != null) 这样写不是更好吗? - Trisped
3
如果您的会话实际上为空,这将导致错误。 - George Johnston

1
你所使用的语法:
if (Session["mySessionVariable"] != null)
{

}

在ASP.NET中,这是检查Session对象的正确方法。我怀疑问题是因为您正在使用ASP.NET MVC。

也许我们的MVC专家可以告诉我们在ASP.NET MVC中正确的做法。

编辑:我看到Marc Gravell在我打字时发布了他的答案。那应该很有启发性。


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

0

你也可以使用:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接