2012-03-08 2 views
0

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

EX:

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

Update:
Некоторые из вас спросили путь я, что делать это?
Я хочу сделать это, чтобы сделать сеанс уникальным для каждой вкладки в браузере. Я вынужден использовать сеанс. Гид будет уникальным идентификатором табуляции. (see solution here)

+1

Почему вы хотите сделать это? Как вы узнаете, какой ключ для извлечения? –

ответ

4

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

Update

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

+1

+1 Согласен. Не вижу причин для этого. Похоже, что OP думает, что сеанс и кеш одинаковы, следовательно, необходим дополнительный уникальный идентификатор. – Icarus

+0

@jrummell Да, я знаю о ViewState, но устаревший код, который я меняю, заставляет меня использовать Session. Спасибо, в любом случае. – Daniel

+0

Если вы меняете код, вы не можете изменить код? – jrummell

1

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

0

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

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

public void SetSession 
{ 
     Session.Add(guid+variable, value); 
} 
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"); 
+0

Спасибо за предложение, но для этого требуется много изменений и тестирования кода, и я не могу этого себе позволить. – Daniel

+0

OP не использует MVC. – jrummell

+0

Обновленный пример кода для включения приложения, отличного от MVC, которое в основном такое же. – anAgent

Смежные вопросы