[ASP.NET Web Forms]Как да включим сесия в клас?


0

 Искам да използвам сесията в ASP Web Forms приложение. Трябва да я използвам в клас с базова логика. В момента не е включена и като пробвам да запиша нова стойност в нея, гърми.

  Доколкото видях в гугъл, мога да я включа в aspx страницата, но този клас се използва от много aspx страници и затова трябва да я включа в самия клас. 

 Някой има ли идея?




Отговори



0

Не съм много вещ в Web Forms, но може да пробваш едно от тези:

HttpContext.Current.Session["test"] = "test";

Session.Add(this.TextBox1.Text,0);

Като цяло на сесията работата и е свързана директно с уеб приложението и не е добра практика външен проект (class library) да знае за нея. :)




0
Пусни код ако обичаш. По-лесно е да се разбере какво се опитваш да направиш. Може да си тръгнал по съвсем различен път от очакваното.

от saykor (8845 точки)


0

Понеже спомена по-долу:

" Та когато искаме да подадем параметър по query стринга и искаме да се запази за цялото пребиваване на user-a в страницата, ми изглежда най-добре да се запише в сесия и в куки. После при нужда от използване на параметър да се провери първо дали го има в сесията, ако не в кукито. Ако едното е заминало и другото е било изключено - греда."

Виж този код: http://pastebin.com/Pf2HjHEd

SessionState ти е обикновен клас в който имаш пропъртита както на теб ти хареса. Това дето получаваш от query можеш да го набуташ там. Примерно:

_sessionState.CountryId = countryId; // където countryId идва от query.

Всеки aspx.cs файл наследява BasePage. В момента най-вероятно те наследяват System.Web.UI.Page. По този начин имаш при всеки достъп до _sessionState.

Всеки път пато се зареди aspx.cs ще мине през Page_Init където ще си зареди _sessionState от Session["sessionState"].

Съответно всеки път като излиза от aspx.cs ще мине през OnPreRenderComplete където ще набута новия _sessionState в сесията Session["sessionState"за да запазва промените.

Ако искаш да го ползваш във някои външен файл от проект тип class library предавай като параметър към някой метод.

По този начин всеки посетител на сайта си има негов _sessionState и всички пропъртита който ти трябват са на едно място. Така не се чудиш в различните места на кода: абе как се казваше Session["userlogin"или Session["loginuser"]

За това ти казах да ми дадеш код. Може да не е това дето ти трябва а може и да е, може да питаш за .asmx, .ashx файл или друг тип. Където трябва да сложиш разни такива работи: 

public class MyAshxClass : IHttpHandler, IRequiresSessionState


от saykor (8845 точки)


0

Опитах да направя ето това:

 HttpContext.Current.Session["test"] = "test";

В момента нямам достъп до кода, а и е 500 реда само този клас. Когато дебъгвах при горното ми хвърля изключение - "The session must be enabled or the appropriate settings in the web config must be put".  В config файла ми стана ясно долу-горе какво трябва да се направи, но се чудех дали е възможно в C# кода да направя.

 И понеже не я разбирам още тази сесия много- Когато искаме да я използваме така Session["test"] = "test"; при ново приложение трябва ли нещо да правим предварително?


от ivan.mihov1 (4988 точки)


0
При ново приложение не трябва нищо по специално да правиш. Въпроса е къде се опитваш да хванеш тази сесия. В кой фаил, какъв тип, къде се намира тоя файл.

от saykor (8845 точки)


4

В ASP.NET Web Forms приложение сесията е включена в default-ния темплейт.

Сесията може да се включва/изключва/настройва от web config-a:

<system.web>
  <sessionstate customprovider="..." mode="InProc/Off/..">
    <providers> ... </providers>
  </sessionstate>
</system.web>

Или отделно за всяка страници при Page директивите:

<%@ Page  ... EnableSessionState="True/False/ReadOnly" %>

Няма как да се включи само за определен външен клас.

edit:

Само заради разбирането на какво е сесията и за какво служи тя си заслужава човек да понаучи малко PHP .. При junior C# web devs наблюдавам тотално неразбиране на концепциите за сесия, кеширане, web.config, дори и кукита. Може би това се дължи на всичките неща, които идват на готово в ASP.NET (като users, roles и т.н.). Не че е нещо лошо да ти дойдат наготово и да се скрие една сложнотия, но за навлизащите в ASP.NET пречи да се научат едни много важни неща :)


от westi3m (5621 точки)


0

 Ще го имам в предвид. Определено съм към графата за тотално неразбиране на сесия, кеширане, web.config и кукита. Кукитата ги използвам като основен метод за предаване на данни, но какво става ако user-a си ги изключи? От друга страна пък май не може да се разчита само на сесия защото тя изтича.

 Та когато искаме да подадем параметър по query стринга и искаме да се запази за цялото пребиваване на user-a в страницата, ми изглежда най-добре да се запише в сесия и в куки. После при нужда от използване на параметър да се провери първо дали го има в сесията, ако не в кукито. Ако едното е заминало и другото е било изключено - греда.

 Специално за това ще се радвам да чуя каква е добрата практика в Web Forms.


от ivan.mihov1 (4988 точки)

0
Можеш да ползваш local storage-a или session storage-а на browser-а вместо cookie-та. Също така в web forms има view state, който обаче не е много добра практика да се ползва.

от triplexsa (60 точки)



0

 Saykor, ето това е кода.

http://pastebin.com/TfD28h3S

Ред 119 ако разкоментирам гърми с ексепшън.
В конкретния сайт в WebConfig на sessionState е дадено enabled. Прочетох това което си писал, но класа SessionState не го намира. Нашите проекти са на .NET 3.5, освен там да е по-различно....


от ivan.mihov1 (4988 точки)


1

Твоят BasePage клас не ми изглежда да е просто някакъв клас, а code behind на BasePage.aspx (или всички останали старници ще го наследяват) ?

Опитваш се да достъпиш сесията в конструктора, но тя е инициализирана и достъпна след AcquireRequestState евента ако не се бъкрам.

SessionState е custom клас на Saykor и е направен за да има типизиран достъп от всички наследници на неговия базов page клас до неща, които ще слага в сесията. Както се вижда Session се използва в Page_Init event-а.

Може би трябва да преместиш твоя код от конструктурa в някой евент като Page_Init, но не съм сигурен тъй като не разгледах подробно кода и не ми стана ясно каква точно е целта му.

Мисля че трябва да прочетеш за application и page life cycle events в Web Forms и ще ти стане по-ясно. 


от westi3m (5621 точки)

1

Принципно @westi3m добре е обяснил идеята ми.

Направи си един клас с име SessionState.

В него сложи: string REF {get; set;}

Копирай логиката дето съм ти дал аз от моя BasePage в твоя

ред Session["REF"] = referalId;

го правиш на: _sessionState.REF = referalId; //въпреки че може пак да гръмне, защото не е минало през Page_Init да зареди сесията.

По същия начин всички други Session["нещоСиТам"]

Така класовете които наследяват BasePage ще имат достъп до _sessionState и съответно до _sessionState.REF и _sessionState.нещоСиТам

Всичко от конструктора го мръдни в Page_Init след зареждането на сесията.


от saykor (8845 точки)