Vraag variabele geïnitialiseerd in klasse verliest de vorige waarde bij het laden van de pagina


Ik heb een String-variabelentest met "hallo" verklaard. elke keer dat ik op Button1 klik, verwacht ik dat die test wordt toegevoegd met de vorige waarde. Maar ik heb gemerkt dat het zijn vorige waarde verliest wanneer op de knop wordt geklikt en de pagina opnieuw wordt geladen. Dat is elke keer dat ik erop klik, het heeft zijn tekst als "hihi". Ik verwacht "hihihihi" bij de volgende klik enzovoort. Wat is hier het probleem met de onderstaande code?

public partial class _Default : System.Web.UI.Page
{

    String test = "hi";

    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        test += test;
        Button1.Text = test;
    }
}

18
2018-05-31 17:32


oorsprong


antwoorden:


Nee, dat is niet de manier waarop asp.net werkt. Als je dat gedrag nodig hebt, zou je dit moeten doen:

public string test {
  get {
    return (string) ViewState["test"] ?? "hi";
  }
  set {
    ViewState["test"] = value;
  }
}

Wanneer ASP.NET een verzoek verzendt naar de server, wordt een nieuwe versie van uw klasse geïnstantieerd. Als u de status wilt verkrijgen, moet u ViewState gebruiken (deze wordt in een verborgen veld in de browser opgeslagen en bij elke aanvraag verzonden, en daarom staat opgeslagen per pagina), of u kunt SessionState gebruiken, een status die per gebruiker wordt opgeslagen. SessionState wordt standaard opgeslagen in het geheugen. Dus als u IIS opnieuw start, verdwijnt deze status. Houd er rekening mee dat de status van de viewstate NIET verdwijnt als u IIS opnieuw instelt (omdat deze door de browser wordt verzonden). U kunt ook de Cache wat opnieuw wordt opgeslagen in het geheugen. Deze staat is voor alle gebruikers van uw applicatie. Dezelfde regels voor het opnieuw instellen van IIS zijn van toepassing. Eindelijk zou je je variabele statisch kunnen maken. Zoals ik al zei, elke keer dat een verzoek wordt gedaan, wordt er een nieuwe versie van je klas geïnstantieerd. Statische variabelen zijn natuurlijk geen instantievariabelen, dus de status van een statische variabele wordt ook in postbacks opgeslagen. Dezelfde regels voor IIS-reset zijn van toepassing op statische variabelen als Cache en Sessie.


31
2018-05-31 17:36



Een veld bestaat alleen voor de duur van een enkel verzoek. Als u wilt dat deze tussen verzoeken leeft, moet u iets gebruiken zoals sessie-status, weergavestatus, een cookie of een HTML-formulier / aanvraagwaarde.

In de meeste "echte" applicaties kunt u niet eens garanderen dat volgende aanvragen door dezelfde worden behandeld fysieke machine.


8
2018-05-31 17:36



Telkens wanneer u een pagina bezoekt, wordt een nieuw exemplaar van de pagina gemaakt met een eigen kopie van uw lokale variabele. Er zijn verschillende manieren waarop u waarden kunt handhaven van de ene paginaweergave tot de volgende en ze worden hier allemaal beschreven: Overzicht ASP.NET State Management


5
2018-05-31 17:37



String test = "hi";

Dit is een privaat veld voor instantieklassen.

Je hebt een statische nodig als je je doel wilt bereiken.

Trouwens, misschien ben je op zoek naar een sessie-item:

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

Op deze manier heb je een code zoals deze in je gebeurtenishandler:

string currentTestText = (string)HttpContext.Current.Session["test"];

currentTestText += currentTestText;
Button1.Text = currentTestText;

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

5
2018-05-31 17:37



Dat komt omdat een knop een POST BACK genereert die u zou kunnen declareren als een statische eigenschap of een sessie ["Test"] of een code toevoegen op de knop klikt als IsPostback {}


4
2018-05-31 17:36



Onthoud dat op een postback de asp.net de objecten opnieuw creëert en de waarden opnieuw toewijst. In uw geval wordt de testvariabele opnieuw aangemaakt en krijgt de waarde 'hi' toegewezen. Misschien wilt u de variabele in sessie opslaan en vervolgens de waarde toevoegen.


3
2018-05-31 17:36



Het probleem met uw code is dat op elke aanvraag uw Pageinstantie wordt zo opnieuw gemaakt test zal de vorige waarde niet behouden omdat deze een nieuwe is Page aanleg.

Dit is de stroom:

Verzoek 1 Start

Page is created -> test = "hi"

Verzoek 1 einden

Page is detroyed

Verzoek 2 Start

Page is created -> test = "hi"

Verzoek 2 einden

Page is detroyed

3
2018-05-31 17:38



Dit werkt, probeer het gewoon

// in the page load event
if(!this.IsPostBack)
   Button1.Text = test;

// in the Click event
this.Button1.Text += test;

Het probleem met uw huidige code is dat u een toewijst instantievariabele naar de knoptekst, omdat het een instantievariabele is die wordt geïnitialiseerd elke keer dat u de pagina met dezelfde waarde opvraagt dat is waarom je altijd krijgt hihi alleen en niet hihihihihihihi

Elke keer dat u op de knop klikt, maakt ASP.Net een new Page(), Daarom, de test lid zal altijd worden geïnitialiseerd zoals: test = "hi";.


2
2018-05-31 17:34