Avatar billede casualty Nybegynder
04. november 2004 - 21:21 Der er 11 kommentarer og
1 løsning

Fortæl mig om Viewstate og Session

Hej... Er der nogen der kan fortælle lidt om hvad Viewstate i ASP.Net er.

Jeg ved meget lidt om det og jeg er i tvivl om det jeg ved er rigtigt...

Jeg er især interesseret i at vide hvad der ligger i viewstate samt viewstate under postback, samt hvad det er der sker når man sætter EnableViewState(true/false) på sine webControls.

Hvad er den helt konkrete forskel på viewstate og session og hvor lange er deres levetider?

Når jeg tilføjer et objekt til min session ligger det så kun på serveren?(min logik siger ja)

det kan være der kommer mere

Mvh Casualty
Avatar billede basementjack Nybegynder
04. november 2004 - 21:27 #1
Viewstate er en kodede oplysninger om de controller du har på din side, dvs. id, value, events osv... Man kan så fjerne viewstate på de controller som asp.net ikke skal huske værdier for...

Session er en fil der gemmes på serveren med oplysninger som du skal give den.. Den sendes ikke med til brugeren, nej..
Avatar billede arne_v Ekspert
04. november 2004 - 21:28 #2
session info ligger kun på server

session info lever lige så længe serveren beholder den
(X minutter efter sidste aktivitet formoder jeg)

Jeg er ikke ekspert i ASP.NET men jeg mener at ViewState er det som
bruges til at holde styr på state mellem forskellige requests for samme
side for samme client. Og at der er information i den genererede HTML
til at hjælpe med det (altså noget client).
Avatar billede ihtezaz Praktikant
04. november 2004 - 23:03 #3
Viewstate >> Kort og godt bruges viewstate til at holde state, når den samme side bliver posteback. Dvs. at dine server componenter kan holde på de data de indeholder, på tværs af postbacks. Derudover kan du også brug viewstate til holde på de data, der nøvendigvis ikke er tilknyttet dine componenter, men blot skal huskes når siden bliver posted back. 


Session >> til forskel fra viewstate, bruges session mere til, at hvis du vil holde state på tværs af forskellige sider. Bruges meget til at holde state f.eks. for en kunde hvis der er tale om en internet butik.   

Håber det hjalp lidt
Avatar billede -mundi- Nybegynder
04. november 2004 - 23:08 #4
Lav en side med nogen kontroller på, lav lidt postback og paste så din viewstate ind her : http://www.wilsondotnet.com/Demos/ViewState.aspx
Avatar billede ihtezaz Praktikant
04. november 2004 - 23:08 #5
viewstate ophøre ikke af sig selv, sålænge du er på den samme side. Når du sætter viewstate false på dine componenter, holdes der ikke state på den enkelte component.
Avatar billede casualty Nybegynder
05. november 2004 - 09:14 #6
Hvordan kan det så være at hvis jeg sætter enableviewstate=false på en control så vil værdien altid kunne aflæses fra den enkelte control. på tværs af postback?
Avatar billede snepnet Nybegynder
05. november 2004 - 12:34 #7
hej casualty :o)

det er fordi dit viewstate genereres udfra en kontrols nuværende tilstand, og det bliver ikke ændret fra du har smidt siden ud til klienten, og til du modtager den igen.
når du kommer tilbage på serveren - vil der derfor i dit viewstate stå hvad værdien var på det tidspunkt du sendte kontrollen ud sidst, hvilket så kan bruges til at udlede om der er sket ændringer.

prøv at kig lidt på nedenstående eksempel (det er VS-stil - håber det er det du bruger).

using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace EXP2.ViewState
{
    public class Samples : System.Web.UI.Page
    {
        protected HtmlForm Form1;

        private void Page_Load(object sender, System.EventArgs e)
        {
            // en textbox
            TextBox  tb = new TextBox();
            // tb.EnableViewState = false;
            tb.TextChanged += new EventHandler(tb_TextChanged);
            Form1.Controls.Add(tb);

            // bare en knap så der kan laves et postback
            Button b = new Button();
            Form1.Controls.Add(b);
        }

        override protected void OnInit(EventArgs e)
        {
            InitializeComponent();
            base.OnInit(e);
        }
       
        private void InitializeComponent()
        {   
            this.Load += new System.EventHandler(this.Page_Load);
        }

        private void tb_TextChanged(object sender, EventArgs e)
        {
            Response.Write("ÆNDRET");
        }
    }
}

Ovenstående vil sikre, at du får fyret dit change-event hver gang der ændres i tekstboksen, og årsagen til det er, at når viewstate loades, vil kontrollen blive fundet i viewstate og det kan udledes at der er sket en ændring -> Eventet fyres.

Hvis du kommenterer denne linie ind :
tb.EnableViewState = false;

Vil du kunne observere følgende (måske lidt overraskende).
Når dit viewstate loades, vil der ikke kunne findes oplysninger om kontrollen, og det vil kontrolleres om indholdet som det kan ses af det data der er postet, at tekstboksen værdi er ændret -> eventet fyres.

Men..... den værdi der sammenlignes med, er så den værdi som tekstboksen har efter page_load er kørt.

Dette vil så igen sige... at du får fyret dit changed-event HVER gang du poster siden til serveren, hvis bare der står et eller andet i boksen.... dvs. skriver du f.eks. hej i boksen første gang du ser den, vil du få fyret eventet og der vil fortsat stå hej i boksen.
hvis du klikker på knappen gentagne gange efter dette vil du stadig få fyret eventet hver gang.
(der vil jo være en ændring fra en tom streng og til hej... set fra serverens side).

Det hele bunder i frameworket, og en side/kontrol processeres - du kan se en oversigt her :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconcontrolexecutionlifecycle.asp

Forklaringen på at eksemplet virker på den beskrevne når EnableViewState=true er, at LoadPostData(står i oversigten i linket ovenfor) kunne se sådan her ud :
(loadpostdata køres på bl.a. teksbokse da de implementerer et interface der hedder IPostBackDataHandler).
Dette er også forklaringen på - at du har du det som brugeren har skrevet ind i tekstboksen liggende i .Text-property'en.

public virtual bool LoadPostData(string postDataKey, NameValueCollection postCollection) {
    // det aktuelle indhold af (i dette tilfælde) tekstboksen
    string presentValue = Text;
    // den værdi der kommer fra det postede data.
    string postedValue = postCollection[postDataKey];
   
    // hvis de ikke er ens - er der sket en ændring
    if (!presentValue.Equals(postedValue)){
          Text = postedValue; // her sættes teksten til det der er postet.
          return true;
    }
    // og ellers er der ikke
    return false;
}

frameworket holder styr på at der er returneret true fra den givne kontrol, og vil senere kalde RaisePostDataChangedEvent, som for en tekstboks kunne være være implementeret som noget i denne stil :

public virtual void RaisePostDataChangedEvent()
{
  OnTextChanged(...);     
}

og metode OnTextChanged for en tekstboks, vil så igen fyre Changed-event, og vil se ud som noget i denne stil :

protected virtual void OnTextChanged(EventArgs e)
{
  if(Changed!=null)
    Changed(this, e);
}

og det er så det der gør at eventet fyres (eller rettere... at du får kaldt den metode du har angivet da du wirede eventet).

Udover linket til MSDN kan du lige få det her :
(Det er en smule langhåret, men der står nogle meget gode ting omkring det)
http://www.codeproject.com/aspnet/PersistentStatePage.asp

Nå.... det blev måske lidt tågesnaksagtigt.... Jeg håber at jeg ikke har formuleret mig fuldstændig uforståeligt - og at du kunne bruge det til et eller andet.
(der er lidt spøgelser i den slags, som du ikke kan læse af codeprojekt-linket ;o)

mvh
Avatar billede casualty Nybegynder
09. november 2004 - 15:03 #8
Hej 1000 tak for hjælpen... Kan i ikke lægge et svar således at jeg kan fordele points efter bedste evne :)

Mvh Casualty
Avatar billede snepnet Nybegynder
09. november 2004 - 18:48 #9
jo :o)
Avatar billede casualty Nybegynder
09. november 2004 - 20:29 #10
Hej snepnet.... Vi skal aflevere hovedopgave i morgen kl. 12.00 (Det bliver en lang nat) og jeg sidder netop nu og skriver kode argumentationer og læringsmål.... Jeg har ikke helt fanget,ud fra din meget fine beskrivelse, hvad det er der gør at en værdi i et tekstfelt ikke forsvinder når jeg laver postback, hvis EnableViewState er false på tekstfeltet.... Stress ;)

Mvh Casualty
Avatar billede snepnet Nybegynder
09. november 2004 - 21:17 #11
værdien står i din form - og frameworket sørger for at initialisere kontroltræet med de værdier der står i formen, og det var det der kunne se ud som denne metode :

public virtual bool LoadPostData(string postDataKey, NameValueCollection postCollection) {
    // det aktuelle indhold af (i dette tilfælde) tekstboksen
    string presentValue = Text;
    // den værdi der kommer fra det postede data.
    string postedValue = postCollection[postDataKey];
   
    // hvis de ikke er ens - er der sket en ændring
    if (!presentValue.Equals(postedValue)){
          Text = postedValue; // her sættes teksten til det der er postet.
          return true;
    }
    // og ellers er der ikke
    return false;
}

Det er denne her :
Text = postedValue; // her sættes teksten til det der er postet.

Rutinen køres inden page_load, og efter page_load fyres et changed_event af hvis metoden har returneret true.

mvh
Avatar billede snepnet Nybegynder
09. november 2004 - 21:18 #12
crap med imorgen.... der bliver jo nok ikke rigtig noget søvn til dig i nat så.... jeg håber du får det færdigt.
mvh
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester