Переопределить объект сеанса asp.NET - PullRequest
0 голосов
/ 08 марта 2012

Возможно ли в asp.net изменить объект Session, чтобы при его использовании для установки / получения он делал что-то еще?

EX:

Session["variable"] Я хотел бы сделать это под одеялом Session[guid + variable] добавить к ключу GUID

Обновление:
Некоторые из вас спрашивали, как мне это сделать?
Я хочу сделать это, чтобы сделать сеанс уникальным для каждой вкладки в браузере. Я вынужден использовать сессию. Guid будет уникальным идентификатором вкладки. ( см. Решение здесь )

Ответы [ 4 ]

4 голосов
/ 08 марта 2012

Вы можете обернуть Session своим собственным классом, который предварительно ожидает guid для ключа сеанса, и затем использовать этот класс вместо Session.С учетом вышесказанного, я не уверен, почему вы захотите.

Обновление

Если вам нужно, чтобы данные были уникальными для каждой вкладки браузера, используйте ViewState вместо.Он используется для сохранения состояния между запросами на определенную страницу / окно браузера / вкладку.

1 голос
/ 09 марта 2012

Для веб-форм вы можете создать базовый класс 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");
1 голос
/ 08 марта 2012

Вы можете создать свой собственный поставщик сеансов для ASP.NET, и после этого вы получите полный контроль над данными сеансов.

0 голосов
/ 08 марта 2012

Это невозможно в прямом смысле без создания собственного поставщика сеансов.Возможный обходной путь может заключаться в создании двух новых методов.Возможно положить их в Global.asax

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

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