【问题标题】:ASP.NET NullReferenceException for get_Session()get_Session() 的 ASP.NET NullReferenceException
【发布时间】:2010-12-03 17:48:10
【问题描述】:
public class MessageHelper : System.Web.UI.MasterPage
{
    public MessageHelper()
    {

    }

    public string Message
    {
        set { Session["Message"] = value; }
        get
        {
            if (Session["Message"] != null)
            {
                var msg = Session["Message"] as string;
                Session["Message"] = "";
                return msg;
            }
            return "";
        }
    }

    public string ErrorMsg
    {
        set { Session["Error"] = value; }
        get
        {
            if (Session["Error"] != null)
            {
                var err = Session["Error"] as string;
                Session["Error"] = "";
                return err;
            }
            return "";
        }
    }
}


[NullReferenceException: Object reference not set to an instance of an object.]
   System.Web.UI.UserControl.get_Session() +15
   WebApplication1.MessageHelper.get_ErrorMsg() in ..file.master.cs:71

第 71 行是:if (Session["Error"] != null)

我在这里做错了什么?!

编辑(转录自原作者):

@大卫,

这里是 AdminMaster.master.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.SessionState;

namespace WebApplication1
{
    public partial class AdminMaster : System.Web.UI.MasterPage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            MessageHelper msg = new MessageHelper();

            if (msg.ErrorMsg != "")
            {
                // do something
            }
            if (msg.ErrorMsg != "")
            {
                // do something
            }
        }
    }
    public class MessageHelper : System.Web.UI.MasterPage
    {
        public MessageHelper()
        {

        }

        public string Message
        {
            set { System.Web.HttpContext.Current.Session["Message"] = value; }
            get
            {
                if (System.Web.HttpContext.Current.Session["Message"] != null)
                {
                    var msg = System.Web.HttpContext.Current.Session["Message"] as string;
                    System.Web.HttpContext.Current.Session["Message"] = "";
                    return msg;
                }
                return "";
            }
        }

        public string ErrorMsg
        {
            set { System.Web.HttpContext.Current.Session["Error"] = value; }
            get
            {
                if (System.Web.HttpContext.Current.Session["Error"] != null)
                {
                    var err = System.Web.HttpContext.Current.Session["Error"] as string;
                    System.Web.HttpContext.Current.Session["Error"] = "";
                    return err;
                }
                return "";
            }
        }
    }
}

所以它确实继承自 System.Web.UI.MasterPage,我的错。

我希望从站点上的不同页面访问 MessageHelper。我所有的页面都使用主文件,这就是我将 MessageHelper 放在主文件中的原因。

这里有什么问题?

【问题讨论】:

  • 会话本身可能为空。
  • @Marcie,确实如此。 @NATTO,调用/引用 .ErrorMsg 的代码在哪里?
  • 怎么来的?那么我该如何解决这个错误呢?
  • 其受保护的 void Page_Load(object sender, EventArgs e) { .....

标签: asp.net session nullreferenceexception


【解决方案1】:

在调试过程中,能否确认Session不为空?尝试在此类中将其完全引用为System.Web.HttpContext.Current.Session,看看是否有帮助。

编辑:响应您发布的未回答的答案...

不建议将该帮助类放在与母版页相同的文件中。将它放在以该类命名的自己的文件中。 (对于每个类是否应该有自己的文件可能存在争议,但在这种特殊情况下,很明显这个文件中的两个类非常不相关,不应该放在一起。)

该类可以有自己的命名空间,例如WebApplication1.Helpers(尽管我建议将来使用比WebApplication1 更具描述性的名称,但不要尝试在此处更改它,因为它会导致其他地方出错project),并且其他类文件可以使用 using WebApplication1.Helpers 引用该命名空间以使用该类。

在项目(或多个项目,随着事情的复杂性增加)中将类分离成一个直观的结构将使其在未来更容易支持。

而且,查看整个文件,帮助类绝对不应该从MasterPage 继承。它不需要,这样做会在该类中添加不应该存在的东西。

【讨论】:

  • 好的,这似乎解决了问题.. 是什么原因造成的?我应该从...继承吗?!?
  • @NATTO:不确定我脑海中的所有细节,但HttpContext.Current 是页面为您预先引用的内容。您正在创建一个单独的类,尽管它继承自 MasterPage(为什么,顺便说一下?将一个类扩展为不符合其本意的东西是很奇怪的),但它似乎不是知道HttpContext.Current 单例,而只是引用一个空的Session
  • 好吧,我把它放在一个单独的类中,因为我希望它可以从每个地方访问,这意味着该类位于主文件上,并且可以从不同的页面访问,我错了吗?
  • @NATTO:单独的课程很好,而且理由正确。我从这段代码中看不到的是为什么该类继承自MasterPage。那个MessageHelper 类实际上是被作为 母版页使用的吗?如果不是,它不应该从它继承。
  • 它不是从它继承的。它在 master.cs 文件上,在同一个命名空间下,它的定义是:public class MessageHelper : System.Web.UI.MasterPage,所以它继承自System.Web.UI.MasterPage..
【解决方案2】:

我对您尝试使用 MessageHelper 类实现的目标感到有些困惑。

如果它是您的母版页共有的代码,那么您肯定应该从 MessageHelper 继承 AdminMaster。

例如。

public partial class AdminMaster : MessageHelper

如果不是,我不明白为什么 MessageHelper 需要从 MasterPage 继承?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    相关资源
    最近更新 更多