Avatar billede fanatic Nybegynder
07. april 2006 - 17:34 Der er 1 kommentar og
1 løsning

Codebehind. Hvorfor gemmes variabler ikke?

Hej Eksperter.

Jeg har ind imellem brug for at gemme en værdi i en variable i codebehind-filerne. Det lader til at fungere lidt anderledes end windows applikationsudvikling. Når jeg sætter en variable lader det til at den ikke bliver gemt. Jeg kunne forestille mig at det er fordi objektet overskrives hver gang der udføres en event på websiden (Postback).
Jeg har lavet et kort eksempel herunder som viser mit problem. Eksemplet viser en boolen-variable som bliver sat "true" når der trykkes på knap1. Trods koden i følge mig selv ser fornuftig ud så bliver variablen aldrig sat til true. Hvad gør jeg galt?


public partial class _Default : System.Web.UI.Page
{
    private Boolean buttonClicked;

    protected void Page_Load(object sender, EventArgs e)
    {
        Label1.Text = buttonClicked.ToString();
        if (!Page.IsPostBack)
        {
            buttonClicked = false;
        }

    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        buttonClicked = true;
    }

    // Udskriver en tekst afhængig af om der er blevet trykket på button1.
    protected void Button2_Click(object sender, EventArgs e)
    {
        if(buttonClicked == false)
            Label1.Text = "Der er blev IKKE trykket på knappen!";
                else if(buttonClicked == true)
                    Label1.Text = "Der blev trykket på knappen!";

    }
}
Avatar billede dr_chaos Nybegynder
07. april 2006 - 19:42 #1
en variabel nulstilles hver gang codebehind kaldes.
En løsning kan være:
public partial class _Default : System.Web.UI.Page
{
    private Boolean buttonClicked;

    protected void Page_Load(object sender, EventArgs e)
    {
        Label1.Text = buttonClicked.ToString();
        if (!Page.IsPostBack)
        {
            buttonClicked = false;
            Session["buttonClicked"] = buttonClicked;
        }

    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        buttonClicked = true;
Session["buttonClicked"] = buttonClicked;
    }

    // Udskriver en tekst afhængig af om der er blevet trykket på button1.
    protected void Button2_Click(object sender, EventArgs e)
    {
        if(((bool)Session["buttonClicked"])== false)
            Label1.Text = "Der er blev IKKE trykket på knappen!";
                else if(((bool)Session["buttonClicked"]) == true)
                    Label1.Text = "Der blev trykket på knappen!";

    }
}

man kan også bruge et asp:hiddenfield til at gemme værdier i
Avatar billede Slettet bruger
08. april 2006 - 07:41 #2
Din klasse _Default bliver lavet fra ny på hvert enkelt requst. Når du har behov for at gemme noget over flere postbacks på en side kan det være praktisk at holde informationen i viewstate. Personligt plejer jeg at lave en property som er understøttet af viewstate, som sådan her:

protected bool ButtonClicked {
  get {
    object f = ViewState["ButtonClicked"];
    return (null != f) ? (bool)f : false;
  }
  set { ViewState["ButtonClicked"] = value; }
}

på den måde kan du også vælge at lade din variable være understøttet af en Session hvis det er mere passende, men foregår det indenfor samme form (side) så er ViewState billigere resource mæssige end at tage en Session på serveren.
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