覆盖asp.NET Session对象

时间:2012-03-08 19:34:09

标签: c# asp.net session webforms override

在asp.net中是否可以更改Session对象,以便在用于设置/获取时,它还能做什么?

EX:

Session["variable"]我希望它能够在封面Session[guid + variable]后面附加一个GUID

更新:
你们有些人问道我该怎么做? 我想这样做是为了使浏览器中每个选项卡的会话都是唯一的。我被迫使用会话。 guid将是一个唯一的标签ID。 (see solution here

4 个答案:

答案 0 :(得分:4)

您可以使用您自己的类来包装Session,该类将guid预先挂起到会话密钥,然后使用该类而不是Session。话虽如此,我不确定你为什么要这样做。

<强>更新

如果您需要每个浏览器标签的数据都是唯一的,请改用ViewState。它用于在特定页面/浏览器窗口/选项卡的请求之间保持状态。

答案 1 :(得分:1)

您可以为ASP.NET创建自己的会话提供程序,然后您可以完全控制会话数据。

答案 2 :(得分:1)

对于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:另一个建议是创建一个“基础”页面类,所有控制器继承该类,以暴露您的方法。像这样:

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");

答案 3 :(得分:0)

在没有创建自己的会话提供程序的情况下,直接意义上是不可能的。可能的解决方法是创建两种新方法。可能将它们放在Global.asax

public String GetSession(String variable)
{
    return Session[guid+variable];
}

public void SetSession
{
        Session.Add(guid+variable, value);
}