我在做练习的时候遇到了这样一个问题,在母版页页面中写入登录和密码修改的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()报错了呢?还希望在这个平台上得到大家的帮助!谢谢

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

页面当中的Session相当于 this.Session

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

Page的 Context属性跟HttpContext.Current引用相等的
这是用reflector查看到的代码。

C# code?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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;
    }
}

最新文章

  1. [LeetCode] Data Stream as Disjoint Intervals 分离区间的数据流
  2. Sikuli增强包
  3. iOS - Alamofire 网络请求
  4. js实现复选框的全选、全不选、反选
  5. Android SurfaceView + MediaPlayer实现分段视频无缝播放
  6. codeforces 675A A. Infinite Sequence(水题)
  7. NetAddr
  8. 修改Oracle 10g Express Edition默认的8080端口
  9. zoj 3841 Cards
  10. Wake-On-LAN待机或休眠模式中唤醒
  11. 一些关于memcpy memmove函数的区别,和模拟实现
  12. Spring+SpringMVC重复加载配置文件问题
  13. 原生ajax函数封装
  14. 小程序之setData特殊情况 三种情况的wx:if
  15. mongodb添加验证用户 删除用户
  16. 网易的Airtest
  17. 天天生鲜 - App设计
  18. PowerDesigner逆向操作(从mysql5.0生成数据库的物理模型),把Comment写到name中,pdm文件导出为word
  19. 线性dp
  20. MyBatis.3.CRUD

热门文章

  1. 发布新版本遇见java.lang.ClassNotFoundException
  2. Navicat 导入Excel与增加主键
  3. Python ssh 远程执行shell命令
  4. 【转】移动oracle LOB索引到其他表空间
  5. 数据链路层--PPP协议
  6. 命令行下载Baiduyun files
  7. 解决 Firefox 火狐浏览器下载 .exe 文件卡住的问题 以及关闭测试版cache2
  8. hdu 3410 单调栈
  9. android自定义日期组件之双DatePicker
  10. Hive mapreduce SQL实现原理——SQL最终分解为MR任务,而group by在MR里和单词统计MR没有区别了