我在做练习的时候遇到了这样一个问题,在母版页页面中写入登录和密码修改的js代码,在登录的方法中写入 HttpContext.Current.Session.Add("UserPwd", dtUser.Rows[0][1].ToString()),以便让这个session在做密码修改的时候和用户输入的密码做比较。但是在母版页的js代码中写入Session["UserPwd"].ToString()总是报错,错误提示是:未将引用对象实例化。在母版页的page_load()方法中写入string ss=Session["UserPwd"].ToString()是可以得到密码的。        在同事的帮助下,找到了解决方法,就是在js方法中将Session["UserPwd"].ToString()改成HttpContext.Current.Session["UserPwd"].ToString()就可以得到密码了。但此时page_load()方法下的string ss=Session["UserPwd"].ToString()又开始报错。所以新的问题又出来了,Session与HttpContext.Current.Session到底有什么区别呢?以下是我在MSDN中找到的结果:        Session 属性提供对 HttpSessionState 类的属性和方法的编程访问。由于 ASP.NET 页包含对 System.Web 命名空间(含有 HttpContext 类)的默认引用,因此在 .aspx 页上可以引用 HttpContext 的成员,而不需要使用对 HttpContext 的完全限定类引用。例如,可使用 Session("SessionVariable1") 获取或设置会话状态变量 SessionVariable1 的值。但是,如果要从 ASP.NET 代码隐藏模块中使用 HttpResponse 的成员,则必须在模块中包括对 System.Web 命名空间的引用,同时还要包括对当前活动的请求/响应上下文以及要使用的 System.Web 中的类的完全限定引用。例如,在代码隐藏页中,必须指定完全限定名称 HttpContext.Current.Session("SessionVariable1")。         如果未启用会话状态,则无法设置或获取会话状态值。若要为应用程序配置会话状态设置,请在 Web.config 文件中设置 sessionState 元素的 mode 属性。启用会话状态后,如果请求一个会话状态变量中不存在的值,则会返回 null。        难道是和这个有关系么?如果说二者没有区别,为什么在将Session["UserPwd"].ToString()改成HttpContext.Current.Session["UserPwd"].ToString()之后,原本正确可以得到结果的string ss=Session["UserPwd"].ToString()报错了呢?还希望在这个平台上得到大家的帮助!谢谢

解决方案 »

  1.   

    HttpContext.Current.Session与Page.Session因为Session是在HttpApplication的AcquireRequestState事件后才有的,而Page类(或其他HttpHandler)的对象是在此之前生成的,看一下HttpApplication的事件次序(查找网上资料)
      

  2.   

    两个是相同的对象
    HttpContext指的是当前请求的HttpHandler实例,而Page就是这个实例,所以访问上没有区别,主要用于一些场景无法获取Page对象,只能用上下文来获取请求实例的情况
      

  3.   

    子夜:
        看了你的回复。我的问题又出来了,“根据网友的介绍的HttpContext.Current.Session
    这个通常用在单独的类里。Page.Session一般是页面的后置类里用。”这是摘自你提供网页上的一段话,请问什么叫后置类?
      

  4.   

    To leileiskzx:    如果二者没有区别,为什么将Session[].ToString()改为HttpContext.Current.Session[].ToString()就可以获取到值,在这种情况下,原本在page_load()方法里的Session[].ToString()却报错了呢?
      

  5.   

    页面当中的Session相当于 this.Session而在不属于页面的时候(比如你所说的母版页,它可不是继承自System.Web.UI.Page;或者是BLL层)就只能通过上下文来获得Session了
      

  6.   

    Page的 Context属性跟HttpContext.Current引用相等的
    这是用reflector查看到的代码。protected internal override HttpContext Context
    {
        [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
        get
        {
            if (this._context == null)
            {
                this._context = HttpContext.Current;
            }
            return this._context;
        }
    }
     
    public virtual HttpSessionState Session
    {
        get
        {
            if (!this._sessionRetrieved)
            {
                this._sessionRetrieved = true;
                try
                {
                    this._session = this.Context.Session;
                }
                catch
                {
                }
            }
            if (this._session == null)
            {
                throw new HttpException(SR.GetString("Session_not_enabled"));
            }
            return this._session;
        }
    }
      

  7.   

    To 高歌:       谢谢你的回复!你说在母版页要通过上下文才能获取到Session,可以下这段代码也是从母版页中写的,其中的Session是可以取到值的。
    public partial class MasterPageApplication_ParentPage : System.Web.UI.MasterPage
    {
        public string strCon = System.Configuration.ConfigurationManager.AppSettings["ConnStr"];    protected void Page_Load(object sender, EventArgs e)
        {
            Ajax.Utility.RegisterTypeForAjax(typeof(MasterPageApplication_ParentPage));
            incon.Value = this.Application["ConnStr"].ToString();        if (!IsPostBack)
            {
                #region 初始化
                if (Session["LoginUserNm"] != null)
                {
                    UserName.Text = Session["LoginUserNm"].ToString();
                    divuserid.Style["display"] = "none";
                    divpassword.Style["display"] = "none";
                    divusername.Style["display"] = "";
                    btnlogin.Style["display"] = "none";
                    btnlogout.Style["display"] = "";
                    btnmodify.Style["display"] = "";
                }
                else
                {
                    divuserid.Style["display"] = "";
                    divpassword.Style["display"] = "";
                    divusername.Style["display"] = "none";
                    btnlogin.Style["display"] = "";
                    btnlogout.Style["display"] = "none";
                    btnmodify.Style["display"] = "none";
                }
                #endregion
            }
        }
    }
      

  8.   

    楼主不如也装个 reflector ,看看那个Session从哪来的,不就明白了。MasterPage 其实是 UserControl 的派生类
      

  9.   

    我也是在迷惑这个问题,按说两者一样的啊,但是我定义了System.Web.HttpContext.Current.Session["dt2"] = datatable2;和System.Web.HttpContext.Current.Session["dt1"] = datatable1;这两个session在两个不同的方法里,但是我引用的时候二者却是相同的,我表示很郁闷啊!
      

  10.   

    前面有说原因了,现说解决方法:using System.Web.SessionState;
    public class PubLib : System.Web.UI.Page, IRequiresSessionState
    注意,在你的类后面加"IRequiresSessionState"就可以与PAGE中的使用同一个SESSION值