Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重写asp.NET会话对象_C#_Asp.net_Session_Webforms_Overriding - Fatal编程技术网

C# 重写asp.NET会话对象

C# 重写asp.NET会话对象,c#,asp.net,session,webforms,overriding,C#,Asp.net,Session,Webforms,Overriding,在asp.net中是否可以更改会话对象,以便在使用它设置/获取时执行其他操作 例: Session[“variable”]我希望它在封面后面进行Session[guid+variable]在键后面附加一个guid 更新: 你们中的一些人问我该怎么做? 我想这样做是为了使会话对于浏览器中的每个选项卡都是唯一的。我被迫使用该会话。guid将是唯一的选项卡id。()您可以使用自己的类包装会话,该类将guid预先挂起到会话密钥,然后使用该类而不是会话。话虽如此,我不知道你为什么要这么做 更新 如果需要每

在asp.net中是否可以更改会话对象,以便在使用它设置/获取时执行其他操作

例:

Session[“variable”]
我希望它在封面后面进行
Session[guid+variable]
在键后面附加一个guid

更新:
你们中的一些人问我该怎么做?

我想这样做是为了使会话对于浏览器中的每个选项卡都是唯一的。我被迫使用该会话。guid将是唯一的选项卡id。()

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

更新


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

您可以使用自己的类包装会话,该类将guid预先挂起到会话键,然后使用该类而不是会话。话虽如此,我不知道你为什么要这么做

更新


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

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

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

不是这样的在直接意义上是可能的,无需创建自己的会话提供程序。一个可能的解决办法是创建两个新方法。可能会把它们放在Global.asax中

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

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

如果不创建自己的会话提供程序,从直接意义上讲这是不可能的。一个可能的解决办法是创建两个新方法。可能会把它们放在Global.asax中

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

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

对于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; }

}
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)];
    }
}
public分部类\u默认值:BasePage{
受保护的无效页面加载(对象发送方、事件参数e){
人员p=新人员{
FirstName=“MyFName”,
LastName=“MyLName”
};
SetSessionData(“somevalue”,p);
var person=GetSessionData(“somevalue”);
}
}
公共类基页:System.Web.UI.Page{
内部void SetSessionData(字符串名称,T值){
Session[string.Format(“{0}{1}”,value.GetType().GUID,name)]=value;
}
内部T GetSessionData(字符串名称){
返回(T)this.Session[string.Format({0}{1}),typeof(T.GUID,name)];
}
}
公共阶层人士{
公众人士(){
ID=Guid.NewGuid();
}
公共Guid ID{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
}
对于MVC:另一个建议是创建一个“基本”页面类,您的所有控制器都从该类继承,从而公开您的方法。喜欢这样:

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; }

}
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)];
    }
}
公共类BaseController:控制器{
内部void SetSessionData(字符串名称,T值){
Session[string.Format(“{0}{1}”,value.GetType().GUID,name)]=value;
}
内部T GetSessionData(字符串名称){
返回(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");
人员p=新人员{
FirstName=“MyFName”,
LastName=“MyLName”
};
SetSessionData(“somevalue”,p);
var person=GetSessionData(“somevalue”);

对于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; }

}
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)];
    }
}
public分部类\u默认值:BasePage{
受保护的无效页面加载(对象发送方、事件参数e){
人员p=新人员{
FirstName=“MyFName”,
LastName=“MyLName”
};
SetSessionData(“somevalue”,p);
var person=GetSessionData(“somevalue”);
}
}
公共类基页:System.Web.UI.Page{
内部void SetSessionData(字符串名称,T值){
Session[string.Format(“{0}{1}”,value.GetType().GUID,name)]=value;
}
内部T GetSessionData(字符串名称){
返回(T)this.Session[string.Format({0}{1}),typeof(T.GUID,name)];
}
}
公共阶层人士{
公众人士(){
ID=Guid.NewGuid();
}
公共Guid ID{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
}
对于MVC:另一个建议是创建一个“基本”页面类,您的所有控制器都从该类继承,从而公开您的方法。喜欢这样:

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; }

}
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)];
    }
}
公共类BaseController:控制器{
内部void SetSessionData(字符串名称,T值){
Session[string.Format(“{0}{1}”,value.GetType().GUID,name)]=value;
}
内部T GetSessionData(字符串名称){
返回(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");
人员p=新人员{
FirstName=“MyFName”,
LastName=“MyLName”
};
SetSessionData(“somevalue”,p);
var person=GetSessionData(“somevalue”);

为什么要这样做?您如何知道要检索什么密钥?为什么要这样做?你怎么知道要检索什么密钥?+1我同意。我看不出这样做的理由。OP似乎认为会话和缓存是相同的,因此需要一个额外的唯一标识符。@jrummell是的,我知道ViewState,但我正在更改的旧代码迫使我使用会话。无论如何谢谢。@jrummell不,我不能。如果我可以的话,我一开始就不会问这个问题。不管怎样,谢谢。好吧,但你应该知道你是哈