覆盖asp.NET会话对象
本文关键字:对象 会话 NET asp 覆盖 | 更新日期: 2023-09-27 18:27:06
在asp.net中是否可以更改Session对象,以便在用于设置/get时执行其他操作?
例如:
Session["variable"]
我喜欢它在封面后面做Session[guid + variable]
在密钥上附加一个GUID
更新:
你们中的一些人问我该怎么做
我想这样做是为了使会话对于浏览器中的每个选项卡都是唯一的。我被迫使用会话。guid将是一个唯一的选项卡id。(请参阅此处的解决方案)
您可以用自己的类包装Session,该类预先挂起会话键的guid,然后使用该类而不是Session。话虽如此,我不确定你为什么要这么做。
更新
如果需要每个浏览器选项卡的数据都是唯一的,请改用ViewState
。它用于在对特定页面/浏览器窗口/选项卡的请求之间保持状态。
您可以为ASP.NET创建自己的会话提供程序,之后您可以完全控制会话数据。
对于Webforms,您可以创建一个基类System.Web.UI.Page,您的所有页面都从该基类继承,以公开您的方法。类似:
public partial class _Default : BasePage {
protected void Page_Load(object sender, EventArgs e) {
Person p = new Person {
FirstName = "MyFName",
LastName = "MyLName"
};
SetSessionData<Person>("somevalue", p);
var person = GetSessionData<Person>("somevalue");
}
}
public class BasePage : System.Web.UI.Page {
internal void SetSessionData<T>(string name, T value) {
this.Session[string.Format("{0}_{1}", value.GetType().GUID, name)] = value;
}
internal T GetSessionData<T>(string name) {
return (T)this.Session[string.Format("{0}_{1}", typeof(T).GUID, name)];
}
}
public class Person {
public Person() {
ID = Guid.NewGuid();
}
public Guid ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
对于MVC:另一个建议是创建一个"Base"Page类,所有控制器都继承该类,以公开您的方法。类似:
public class BaseController : Controller {
internal void SetSessionData<T>(string name, T value) {
this.Session[string.Format("{0}_{1}",value.GetType().GUID,name)] = value;
}
internal T GetSessionData<T>(string name) {
return (T)this.Session[string.Format("{0}_{1}", typeof(T).GUID, name)];
}
}
然后,你可以这样获取或设置项目:
Person p = new Person{
FirstName = "MyFName",
LastName = "MyLName"
};
SetSessionData<Person>("somevalue", p);
var person = GetSessionData<Person>("somevalue");
如果不创建自己的会话提供程序,就不可能直接实现。一个可能的解决方案是创建两种新方法。可能会将它们放入Global.asax
public String GetSession(String variable)
{
return Session[guid+variable];
}
public void SetSession
{
Session.Add(guid+variable, value);
}