【问题标题】:C# Cannot check Session exists?C#无法检查会话是否存在?
【发布时间】:2010-10-20 01:49:22
【问题描述】:

执行以下操作时出现错误:

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

我得到的错误是这样的:

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

这是为什么?我总是这样检查我的会话?我用的是MVC框架,和这个有关系吗?

编辑:

代码在Controller的构造函数中:

public class MyController : ControllerBase
{
    private int mVar;

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

【问题讨论】:

  • 我发现您检查会话值的方式存在潜在问题。您应该将其设置为“var myvar = Session["value"];"然后检查它是否为空并将其转换回来。在检查和强制转换之间会话有可能变得无效。 - 只是觉得你应该知道:)
  • 您不需要var myvar = Session["value"]; if(myvar != null)... ,因为if (Session["value"] != null) 可以正常工作。我也不担心得到Session["value"] 两次(一次用于!= null,一次用于设置变量),因为优化器应该处理这个问题。注意:您可能会发现?? operator 很有用:mVar= (int)Session["value"] ?? 0;。这不会解决该线程所涉及的空会话问题(因为它不是检查 Session 而是检查 Session 的值)。

标签: c# asp.net-mvc session exists


【解决方案1】:

你也可以使用:

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

【讨论】:

    【解决方案2】:
    if(Session != null && Session["name"] != null && Session["name"].ToString()!="")
    {
       //fire code
    }
    

    【讨论】:

      【解决方案3】:

      我是这样解决的:

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

      【讨论】:

      • if (Session != null 0 && Session["mySessionVariable"] != null) 不是更好吗?
      • -1 如果您的会话实际上为空,这将引发错误。
      【解决方案4】:

      会话仅在动作的处理期间真正存在 - 我不希望它在控制器的构造函数中有效。例如,控制器可能(据我所知)在请求之间重复使用。

      您将需要在操作(方法)或(可能更合适)在操作过滤器或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
          }
      }
      

      【讨论】:

      • 谢谢。但是为什么我需要使用 filterContext.RequestContext.HttpContext.Session["val"] 而不是 Session["val"] ?我还需要调用 base.OnActionExecuting(filterContext); 吗?
      • 好的 :) 你能简单地告诉我 filterContext 是关于什么的吗?
      • 这只是将附加状态(通常不直接在成员中可用)传递给过滤器方法的方式。 IIRC,在 ASP.NET MVC In Action (Manning) 中有更多提及。
      • Erm... ASP.NET MVC In Action,如前所述。不过还有其他的。
      【解决方案5】:

      你使用的语法:

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

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

      也许我们的一些 MVC 专家可以启发我们在 ASP.NET MVC 中执行此操作的正确方法。

      编辑:我看到 Marc Gravell 在我输入此内容时发布了他的答案。这应该很有启发性。

      【讨论】:

        【解决方案6】:

        [] 是一个索引器,它的作用类似于类上的方法。

        在这种情况下,Session 为空,您无法对其执行索引。

        这样做:

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

        【讨论】:

        • 谢谢。完全有道理。今天学到了一点东西!
        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

          你必须这样做-

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

          【讨论】:

          • 'System.Web.HttpContextBase' 不包含'Current' 的定义,并且找不到接受'System.Web.HttpContextBase' 类型的第一个参数的扩展方法'Current'(你是缺少 using 指令或程序集引用?)
          • 当我离开当前对象时,它确实有效。但我仍然得到错误。我认为这与 Partario 所说的有关:Session 对象本身为空。现在 lat 知道为什么了:S...
          • 这样做会起作用:System.Web.HttpContext.Current.Session["Value"]
          猜你喜欢
          • 2011-12-29
          • 2018-04-04
          • 2013-02-26
          • 2013-05-22
          • 2011-02-18
          • 2012-10-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多