23. juli 2007 - 12:05Der er
18 kommentarer og 1 løsning
Variabel initialiserer uønsket
public string Text {
get { return (string)ViewState["Text"]; }
set { ViewState["Text"] = value; }
}
Hej Jeg vil gerne lave en tæller (variablen pageID), som skal tælle en op hvergang der bliver trykket på en knap / link. Desværre initialiserer siden sig hvergang så variablen forbliver uændret :-(
Uddrag af kode (tælleren er pageID):
index.aspx.cs ...............
public partial class videnominvestering_artikelarkiv_index : System.Web.UI.Page { public int articleID, pageID = 0;
public void Updatelinks(Object sender, EventArgs e) {
Systemet er "fire-and-forget", så det er lige meget om det er den samme side eller en anden side. Svarer til, hver gang, at du tænder din computer, laver et eller andet, og slukker. Kun hvis du eksplicit har gemt noget, så overlever det til næste gang.
Nu tilbyder frameworket en "work-around" når man poster tilbage til samme side, i og med at der er en "viewstate" : kontrollernes data bliver smidt ind i html'en og sendt til kilenten, og læst derfra ved postback til samme side. Derfor ser det ud som om at systemet "husker" ting. Men almindelige dødelige "variable" skal du selv huske - f.eks. i viewstate (så kan de retrieves men kun ved postback til samme side) eller i session, så kan de "overføres" fra side til side.
' i page load: if not page.ispostback then 'her er vi på siden første gang, så initialiserer og gemmer i viewstate ' initialisér variablen myCounter = 0 'gem den i viewstate ViewState("myCounter") = myCounter else ' få værdien fra viewstate ved postback 'ctype er VB'sk for casting myCounter = Ctype(ViewState("myCounter"), Integer) mycounter += 1 'gem værdien til næste gang ViewState("myCounter") = myCounter end if
hvis du erstatter viewstate med session, så er værdien tilgængelig også fra andre sider for en bruger i samme session, men til gengæld hænger den derude i hukommelsen indtil session dør eller du dræber værdien selv, whichever comes first.
Nå ja - og alt dette her "viewstate" halløj får du sådan set "gratis" hvis du blot laver en textbox med .Visible=False (hvilket gør at den slet ikke renderes til klienten, men dens viewstate gør !) Så kan du lægge værdien for din variabel ind i mytextbox.text ved page load og hente/opdatere den ved alle postbacks. Effekten er den samme.
Svar. I øvrigt - du er bekendt med debuggeren ? Der kan du følge din kode skridt for skridt, se hvordan rækkefølgen er, og se variablernes værdier. Hvis du ikke kender den, så tryk, i kode vinduet, på den grå vertikale bjælke yderst til venstre i vinduet. Der vil nu være en brun klat - et break point - hvor koden stopper. Der dukker en værktøjslinje op, og i den kan du trykke på Step Over eller Step Into. Step Over tager dig til den neæste linje kode du ser, mens Step Into tager dig også ind i funktionskald osv. Du kan slette en break point mens du kører ved at klikke på den. Du kan køre koden til næste break point eller til enden ved at trykke på continue.
jo - jeg kender den godt nok og bruger den også når jeg laver windows-forms. Men det her web-ting er nyt for mig. Men JA tak for tippet, må se at bruge debuggeren.
Ja - session/viewstate er nyttige til f.eks. at smide en arraylist ind i, den er jo lidt svær at opbevare i en textbox :) og session/cache til datasets
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.