问题:HttpContext.Current.Session;结果:Session与HttpContext.Current.Session到底有什么区别呢?
我在做练习的时候遇到了这样一个问题,在母版页页面中写入登录和密码修改的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查看到的代码。
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; } } |
最新文章
- [LeetCode] Data Stream as Disjoint Intervals 分离区间的数据流
- Sikuli增强包
- iOS - Alamofire 网络请求
- js实现复选框的全选、全不选、反选
- Android SurfaceView + MediaPlayer实现分段视频无缝播放
- codeforces 675A A. Infinite Sequence(水题)
- NetAddr
- 修改Oracle 10g Express Edition默认的8080端口
- zoj 3841 Cards
- Wake-On-LAN待机或休眠模式中唤醒
- 一些关于memcpy memmove函数的区别,和模拟实现
- Spring+SpringMVC重复加载配置文件问题
- 原生ajax函数封装
- 小程序之setData特殊情况 三种情况的wx:if
- mongodb添加验证用户 删除用户
- 网易的Airtest
- 天天生鲜 - App设计
- PowerDesigner逆向操作(从mysql5.0生成数据库的物理模型),把Comment写到name中,pdm文件导出为word
- 线性dp
- MyBatis.3.CRUD
热门文章
- 发布新版本遇见java.lang.ClassNotFoundException
- Navicat 导入Excel与增加主键
- Python ssh 远程执行shell命令
- 【转】移动oracle LOB索引到其他表空间
- 数据链路层--PPP协议
- 命令行下载Baiduyun files
- 解决 Firefox 火狐浏览器下载 .exe 文件卡住的问题 以及关闭测试版cache2
- hdu 3410 单调栈
- android自定义日期组件之双DatePicker
- Hive mapreduce SQL实现原理——SQL最终分解为MR任务,而group by在MR里和单词统计MR没有区别了