AppCode的cs文件中获得HttpContext,操作Session、Request、Response、Server等
今天在将一些页面公用的代码抽取到App_Code的cs文件的静态方法中,其中有用到Session和Response对象,哪知怎么也添加不了Session和Resonse的引用,于是像普通页面一样继承System.Web.UI.Page,但发现用到Session和Response的地方总是出现波浪线,提示错误!发现原来Session和Response并不是Page中的静态变量。
于是便将页面Page对象作为参数传入静态方法,如下
public static object getSession(System.Web.UI.Page page);可以使用page.Session["sessionName"]获得Seesion值
在调用该方法的页面中传入this,如
object tmp = getSession(this);
发现如果调用该方法的页面继承了System.Web.UI.Page是可以的,然而如果是用户控件就不可以了,但用户控件中的确有Session对象。于是便想传入一个Page和UserControl都继承的类或接口,发现System.Web.UI.Page和System.Web.UI.UserControl都继承了TemplateControl,于是便将方法原型修改如下:
public static object getSession(TemplateControl tc);
发现tc.Session["sessionName"]竟然是错误的。
没办法只能百度了。终于找到一些文章,说可以使用HttpContext操作Session。自己动手实践了一下,发现果然可以。见下面简单的例子。
1. 在Default.aspx.cs的Page_Load函数中写Session
protected void Page_Load(object sender, EventArgs e)
{
Session["testName"] = "Hello World!";
Response.Redirect("testPage.aspx");
}
2. 添加一个类Common.cs,读取Session值
public static object GetSession(string SessionName)
{
return HttpContext.Current.Session[SessionName];
}
3. 在testPage.aspx.cs中调用GetSession方法显示Session
protected void Page_Load(object sender, EventArgs e)
{
Response.Write(Common.GetSession("testName").ToString());
}
发现果然成功地往testPage.aspx页面写出了Seesion的值“Hello World!”
但有些文章说要在cs文件中实现接口IRequiresSessionState才能获取得到Session的值,否则为null。但亲自实现,不用也可以,不知什么缘故。