Pra*_*ant 153 c# asp.net session-variables
我在应用程序的App_Code文件夹中创建了一个类文件.我有一个会话变量
Session["loginId"]
Run Code Online (Sandbox Code Playgroud)
我想在我的类中访问此会话变量,但是当我编写以下行时,它会给出错误
Session["loginId"]
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我如何访问在ASP.NET 2.0(C#)中的app_code文件夹中创建的类中的会话变量
M4N*_*M4N 355
(为了完整性而更新)
您可以使用Session["loginId"]任何类(例如,从类库中)从任何页面或控件访问会话变量,使用System.Web.HttpContext.Current.Session["loginId"].
但请继续阅读我的原始答案......
我总是在ASP.NET会话周围使用包装类来简化对会话变量的访问:
public class MySession
{
// private constructor
private MySession()
{
Property1 = "default value";
}
// Gets the current session.
public static MySession Current
{
get
{
MySession session =
(MySession)HttpContext.Current.Session["__MySession__"];
if (session == null)
{
session = new MySession();
HttpContext.Current.Session["__MySession__"] = session;
}
return session;
}
}
// **** add your session properties here, e.g like this:
public string Property1 { get; set; }
public DateTime MyDate { get; set; }
public int LoginId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
此类在ASP.NET会话中存储自身的一个实例,并允许您以类型安全的方式从任何类访问会话属性,例如:
int loginId = MySession.Current.LoginId;
string property1 = MySession.Current.Property1;
MySession.Current.Property1 = newValue;
DateTime myDate = MySession.Current.MyDate;
MySession.Current.MyDate = DateTime.Now;
Run Code Online (Sandbox Code Playgroud)
这种方法有几个优点:
Ant*_*nes 100
通过线程HttpContext访问Session: -
HttpContext.Current.Session["loginId"]
Run Code Online (Sandbox Code Playgroud)
小智 24
建议的解决方案的问题是,如果您使用进程外会话存储,它可能会破坏SessionState中内置的一些性能功能.("状态服务器模式"或"SQL Server模式").在oop模式中,会话数据需要在页面请求结束时序列化,并在页面请求开始时反序列化,这可能是昂贵的.为了提高性能,SessionState尝试仅在第一次访问变量时仅对反序列化变量进行反序列化,并且只重新序列化并替换已更改的变量.如果您有很多会话变量并将它们全部推送到一个类中,那么会话中的所有内容都将在每个使用会话的页面请求上反序列化,即使只更改了1个属性,所有内容也需要再次序列化.如果您使用大量会话和oop模式,只需要考虑一些事项.
Cer*_*rus 12
我之前提出的答案提供了解决问题的方法,但是,我觉得理解为什么会出现这个错误很重要:
返回与该特定请求相关的类型实例的Session属性.实际上相当于调用.PageHttpSessionStatePage.SessionPage.Context.Session
MSDN解释了这是如何可行的:
因为ASP.NET页面包含对System.Web命名空间(包含
HttpContext该类)的默认引用,所以您可以引用HttpContext.aspx页面上的成员而不具有完全限定的类引用HttpContext.
但是,当您尝试在App_Code中的类中访问此属性时,除非您的类派生自Page类,否则该属性将不可用.
我对这种经常遇到的场景的解决方案是我从不将页面对象传递给类.我宁愿从页面Session中提取所需的对象,并以名称 - 值集合/ Array/List的形式将它们传递给Class,具体取决于具体情况.
| 归档时间: |
|
| 查看次数: |
310022 次 |
| 最近记录: |