Session in WebUserControl (*.ascx)

Pozdravljeni!

Po več poskusih sem se obračam na vas.

Sem noob pri asp.net-u predvsem pa pri session-ih. Naredil sem si simple aplication-jo, kjer imamv Default.aspx dva LinkButton-a s katerim kličem controlo.

Primer:

  protected void LinkBtn1_Click ( object sender, EventArgs e )
    {
        SetWUC ( "~/WUC/wuc1.ascx" );
        plhModul.Controls.Clear ( );
        plhModul.Controls.Add ( Page.LoadControl ( GetWUC ( "WUC" ) ) );
        Label1.Text = GetWUC ( "WUC" );
    }

v Global.asax sem v Session_Start zapisal Session["WUC"] = "" kar pomeni dahočem da je prazen.

v Default.aspx.cs -> Page_Load sem zapisal

        if ( GetWUC ( "WUC" ) == "" )
            SetWUC ( "~/WUC/wuc1.ascx" );

        if ( Session [ "WUC" ] != GetWUC ( "WUC" ) )
            plhModul.Controls.Add ( LoadControl ( GetWUC ( "WUC" ) ) );

Morda sem preveč zapisal ... 

Sedaj pa k, problemu. v npr. wuc1.ascx imam še komponente lblIzpis (Label) in txbNiz (TextBox) in btnPotrdilo (Button).

koda v 

    protected void Page_Load(object sender, EventArgs e)
    {
    }
    protected void btnPotrdilo_Click ( object sender, EventArgs e )
    {
        lblIzpis.Text = txbNiz.Text;
    }
 Ko se refreša stran rezultata ni oz. controla se zbriše. Vem, da je nekje narobe ampak ne vem kako naj naredim, da stran ostala in prikazala rezultat.

Možno je da sem čudno razložil, zato me prosim popravite.

Hvala vam za odgovor. 

Avtor: matijaz, objavljeno na portalu SloDug.si (Arhiv)

Leave a comment

Please note that we won't show your email to others, or use it for sending unwanted emails. We will only use it to render your Gravatar image and to validate you as a real person.

bojanv
bojanv - ponedeljek, 23. april 2007

matijaz: Sicer pa ... zakaj pa je sploh Web User Control namenjen, če ne kreiranju dinamičnih spletnih straneh oz. spletnih aplikacij. Namen je odvisen od lastnega videnja uporabnosti, zato te razumem, zakaj se igrš. Tudi sam sem se, dokler sem zaradi teh ciklov grizel mizo. Skratka, če ni potrebe po tem. torej dodajanje različnih kontrol in funkcionalnosti na stran, kjer drugače ni mogoče. matijaz: Kdor ne vzdraja ne pride nikamor  Dokler vztrajnost ne preide v obsedenost, je vse kul...

AndrejT
AndrejT - ponedeljek, 23. april 2007

matijaz:Dobro vprašanje. Zakaj vztrajam? Rad bi videl kak to deluje.  Odličen razlog , vendar za vsako opravilo obstaja pravo orodje. Dinamična spletna stran še ne pomeni nujno dinamičnega nalaganja kontrolnikov. Kot rečeno isti efekt z mnogo manj truda in kode lahko dosežeš z uporabo kontrolnika MultiView ali še bolj enostavno krmiljenja lastnosti Visible na true/false. [povej, če rabiš konkreten primer]MMG: V zvezi z dinamičnim nalaganjem ti je Bojan nanizal nekaj hudo uporabnih povezav. matijaz:Kdor ne vzdraja ne pride nikamor  True, true... 

matijaz
matijaz - ponedeljek, 23. april 2007

AndrejT:S kakšnim razlogom vztrajaš na dinamičnem nalaganju kontrolnikov? Tvoj primer izgleda pisan na kožo MultiViewu...Dobro vprašanje. Zakaj vztrajam? Rad bi videl kak to deluje.  Sicer pa ... zakaj pa je sploh Web User Control namenjen, če ne kreiranju dinamičnih spletnih straneh oz. spletnih aplikacij.  Kdor ne vzdraja ne pride nikamor  

bojanv
bojanv - ponedeljek, 23. april 2007

Se strinjam z AndrejemT. Zakaj se ti to zgodi, je v ciklu strani (če si začetnik, naštudiraj prvo to, ker ti bo rešilo ogromno problemov). Load se zgodi pred KLIKOM oziroma  eventi se naložijo po load-u ( daj v Init) . Tale link ti je pisan na kožo za ta problem. Lahko daš v ViewState, samo spet, kontrole ni najbolj pametno dajat v ViewState. Ali pa izkoristi ControlState od kontrole. Seveda, pazit moraš na pravilno uporabo le tega. S tem lahko veliko profitiras, samo lahko pa tudi izgubiš. Malce si preberi na temle linku.

AndrejT
AndrejT - ponedeljek, 23. april 2007

S kakšnim razlogom vztrajaš na dinamičnem nalaganju kontrolnikov? Tvoj primer izgleda pisan na kožo MultiViewu...

matijaz
matijaz - ponedeljek, 23. april 2007

No podatke nekako ne mislim prenašati, razen če gre za npr: logina, ker sta samo 2 podatka. No ne vem kako bi še kako drugače povedal.Zato bom dal kodo, samo me malo skrbi da ne bom preveč raztegnilo.public partial class _Default : System.Web.UI.Page {    protected void Page_Load ( object sender, EventArgs e )    {        if ( Session [ "WUC" ] != null )        {            Control control = LoadControl ( GetWUC ( "WUC" ) );            plhModul.Controls.Add ( control );        }    }    String GetWUC ( String key )    {        return Session [ key ].ToString ( );    }    void SetWUC ( String str_cotrnol )    {        if ( Session [ "WUC" ].ToString ( ) != str_cotrnol )            Session [ "WUC" ] = str_cotrnol;    }    protected void LinkBtn1_Click ( object sender, EventArgs e )    {        if ( GetWUC ( "WUC" ) != "~/WUC/wuc1.ascx" )        {            SetWUC ( "~/WUC/wuc1.ascx" );            Control control = LoadControl ( GetWUC ( "WUC" ) );            plhModul.Controls.Add ( control );        }    }    protected void LinkBtn2_Click ( object sender, EventArgs e )    {        //..        if ( GetWUC ( "WUC" ) != "~/WUC/wuc2.ascx" )        {            SetWUC ( "~/WUC/wuc2.ascx" );            Control control = LoadControl ( GetWUC ( "WUC" ) );            plhModul.Controls.Add ( control );        }    }}  to je koda iz, kot je razvidno iz Default.aspx.cs. V Global.asax pa:    void Session_Start(object sender, EventArgs e)     {        // Code that runs when a new session is started        Session [ "WUC" ] = "~/WUC/wuc1.ascx";        Session.Timeout = 5;    } V wuc1.ascx.cspublic partial class wuc1 : System.Web.UI.UserControl{    protected void Page_Load(object sender, EventArgs e)    {    }    protected void btnPotrdilo_Click ( object sender, EventArgs e )    {        lblIzpis.Text = txbNiz.Text;    }} Še nekaj sem pozabil dopisati, da sem šel celo po debugerju gledat kaj se dogaj. Ko aktiviram btnPotrdilo_CLick v wuc1.ascx sem opazil, da aplikacija gre najprej v Page_Load šele potem v npr: LinkBtn1_Click iz zato mi enostavno zbriše Session.Ali bi lahko to rešil tudi z ViewState-om ali s čim drugim?

AndrejT
AndrejT - ponedeljek, 23. april 2007

Delo z dinamičnimi kontrolniki v ASP.NET ni ravno trivialna zadeva in se mu, če zares ni potrebno, lahko izogneš. Katero metodo ubereš, je odvisno od tega, kaj je tvoj namen s temi kontrolniki. Ko govoriš o podstraneh... Mogoče bi lahko uporabil sistem master page-ov, katere lahko tudi gnezdiš? Primer za Login, ki ga opisuješ, je recimo rešljiv na ta način. Poleg tega je tu tudi kontrolnik MultiView/View, ki ti omogoče preklapljanje med določenimi "stranmi" glede na pogoje, ki jih določiš in krmiliš sam... Potreba po dinamičnem nalaganju kontrolnikov pa je potrebna le v primeru, da v času načrtovanja (design time) ne veš zagotovo, kateri tip kontrolnika boš v runtime dejansko nalagal oz. za to zveš šele v runtime.

pril
pril - ponedeljek, 23. april 2007

Aha, mogoče sedaj razumem - ti želiš vedeti kako prenašati podatke z ene strani na drugo? Za same podatke (to so moje izkušnje) se viewstate tehnologije izogibam in jo imam izključeno (razen v redkih primerih) ker ni potrebno še toliko in toliko kb podatkov vleči s strani na stran, kar poveča promet, poleg tega se stvar zgubi z redirectom. V sesion se lahko dajejo celi objekti (super stvar, samo pazi da se lahko deserializirajo, tako da jih - če stvar zraste - lahko daš na state server ali po potrebi v bazo - če se tega lotiš naknadno se zna stvar zakomplicirat) v cookie pa daješ podatke, ki naj ostanejo na klientu. Url parametre uporabiš kadar želiš da se lahko parametri spreminajo od zunaj (druge aplikacije, npr search ipd) ali kadar želiš da uporabnik nastavitve strani spravi v favorites (to jaz precej uporabljam, se mi zdi praktično, bolj resni uporabniki mojih aplikacij so načelno navdušeni, da imajo vse na klik po logiki, ki jim je blizu :-) Če uporabljaš m$ priporočila potem se itak vse vleče s strani na stran s post metodo (in skupaj z view state-om), ampak pri redirectih in podobnem pomeni to dodaten round-trip. Upam da je to kar si želel vprašat?lp, pl

matijaz
matijaz - ponedeljek, 23. april 2007

AndrejT:Nisem čisto prepričan, kaj želiš naredit, vendar mogoče bi lahko poskusil tako, da daš svoj wuc1.ascx direktno na svoj page, privzeto nastaviš njegov Visible na false, nato pa to isto lastnost kontroliraš (true, false) glede na vrednost, ki jo zapisuješ v session?Dodajanje controle v aspx mi ne dela probleme. Dela mi probleme samo dinamično dodajanje controle z componentami. Obrnil sem se po pomoč, ker ne razumem dobro kaj in kako naj bi obdržal controlo ko se refreša stran.Vem da je več fint (Session, ViewState, Cookie ... ) 

matijaz
matijaz - ponedeljek, 23. april 2007

Razlog je ta, da hočem v glavni strani (Default.aspx) dinamično odpirati podstrani (*.ascx) z componentami in z njimi upravljati v isti podstrani ali pa rezultat prikazati v vseh podstraneh (npr. Login). Ko se celotna stran refreša se mi ta postran zbriše. Zato me pa tudi zanima  ali sem narobe napisal ali pa premalo. Vem, da je več fint.  Sedaj me pa zanima katera je varijantaje naprimernejša.Hvala vam za odgovor. 

pril
pril - ponedeljek, 23. april 2007

Nisem čisto prepričan, mogoče te moti persistance, al kako se že reče tej pridobitvi v asp.net-u, ki je lahko zelo koristna, mi gre pa velikokrat na živce - bolj ja kot ne, ker se izogibam postbacka, če se le da, še en roundtrip preveč. Preveri stvar tako da narediš Overrides (upam da je ista beseda v c#) čez reneder metodo, zamenjaš svojo vrednost in potem narediš šele render MyBase.Render(writer). Če je vrednost na koncu taka kot jo želiš, potem je to prava stvar.Dopuščam možnost, da sem usekal čisto mimo in nisem pravilno razumel tvojega vprašanja lp, pl

bojanv
bojanv - ponedeljek, 23. april 2007

Ejla!Finta, zakaj vse skupaj izgine, je  dinamičnem loadanju strani. Dodajaš kontrolo v ciklu, ko stran te kontrole ni dodala v "življenjski cikel" strani in "se ni vklopila v družbo". Dodat moraš to zadevo v kakšnem bolj zgodnjem eventu, da se ViewState pravilno inicializira. Drugače sploh, zakaj rabiš sploh dinamično dodajat kontrole? Je kakšen poseben razlog? Je kakšen poseben razlog, da ob začetku aplikacije rezerviraš spomin za session? Ga potrebuješ Skratka, nočem težit s vprašanji, samo mogoče, če boš povedal, kaj točno želiš narediti, ti bom lahko bolj točno in arhitekturno odgovoril...

AndrejT
AndrejT - ponedeljek, 23. april 2007

Nisem čisto prepričan, kaj želiš naredit, vendar mogoče bi lahko poskusil tako, da daš svoj wuc1.ascx direktno na svoj page, privzeto nastaviš njegov Visible na false, nato pa to isto lastnost kontroliraš (true, false) glede na vrednost, ki jo zapisuješ v session?