2 Stimmen

Viewstate - völlige Verwirrung.

Das hat mich total verwirrt. Kann mir das jemand erklären?

Markup:

<form id="form1" runat="server">
    <asp:TextBox runat="server" ID="txtTest" />
    <asp:PlaceHolder runat="server" ID="PlaceHolder1" />
    <asp:Button runat="server" Text="Click" />
</form>

Code Behind:

protected void Page_Load(object sender, EventArgs e)
{
    txtTest.Text = "BBB";
    PlaceHolder1.Controls.Add(new TextBox() { Text = "AAA" });
}    

Wenn ich den Text in beiden Textfeldern ändere und dann auf die Schaltfläche "Klicken" klicke, wird der Text in txtTest auf den ursprünglichen Wert "BBB" zurückgesetzt (der in page_load angegeben wurde), aber das dynamische Textfeld behält den Wert, den ich gerade eingegeben habe (und nicht "AAA"), obwohl dieser zur gleichen Zeit wie das andere, "hartkodierte" Textfeld angegeben wurde.

3voto

Jeff Cyr Punkte 4676

Die statische Textbox muss nur einmal mit dem !IsPostBack-Check initialisiert werden.

if (!IsPostBack)
{
    txtTest.Text = "BBB";
}

Das dynamische Textfeld behält seinen Wert, da der Viewstate auf es angewendet wird, wenn es der PlaceHolder-Steuerelementsammlung hinzugefügt wird.

Wenn Sie dies stattdessen tun, würde der geänderte Wert verloren gehen:

TextBox txt = new TextBox();
PlaceHolder1.Controls.Add(txt);
txt.Text = "AAA";

Modifier : Wie von Mike J. erwähnt, ist das vorangehende Codebeispiel falsch.

Der Code von Jeff Cyr funktioniert nicht, weil die Steuerung nicht aufholen kann bis Sie Page_Load beenden.

3voto

Mike J Punkte 1144

Der Wert für txtTest wird in Ihrem Page_Load-Ereignis überschrieben, so dass Sie den ViewState-Wert nicht sehen. Der ViewState-Wert wird in der PreLoad-Phase geladen.

Der Wert für das dynamische Steuerelement erhält den ViewState-Wert, da Sie den Text festlegen und dann das Steuerelement zur Seite hinzufügen. Wenn das Steuerelement der Seite hinzugefügt wird, holt es seine Ereignisse nach. Während dieser Aufholjagd wird der Wert aus dem ViewState geladen und überschreibt Ihren ursprünglichen Wert.

Der Code von Jeff Cyr funktioniert nicht, weil das Steuerelement erst nach dem Beenden von Page_Load wieder aufholt. Sie können dies sehen, wenn Sie in die neue TextBox der Load-Ereignis binden und werfen in ein paar Response.Writes.

protected void Page_Load(object sender, EventArgs e)
{
    txtTest.Text = "BBB";
    //PlaceHolder1.Controls.Add(new TextBox() { Text = "AAA" });
    TextBox txt = new TextBox();
    txt.Load += new EventHandler(txt_Load);
    PlaceHolder1.Controls.Add(txt);
    Response.Write("page load");
    txt.Text = "AAA";
}

void txt_Load(object sender, EventArgs e)
{
    Response.Write("textbox load");
}

1voto

Russ Cam Punkte 120837

Ich denke, Sie sollten den Code, der den Text festlegt, in if(!IsPostBack)

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        txtTest.Text = "BBB";
    }

PlaceHolder1.Controls.Add(new TextBox() { Text = "AAA" });
}

wie für die new TextBox() Code, der Wert des Text Eigenschaft wird auf die TextBox bevor er der Seite hinzugefügt wird, und behält daher die vom Benutzer eingegebenen Änderungen am Text beim Postback bei.

1voto

Saar Punkte 8016

Zusätzlich zur Antwort von o.k.w.

beginnen Sie mit dem folgenden Code, um zu lernen.

<form id="form1" runat="server">
    <div>
        <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_OnClick" />
    </div>
</form>

protected void Page_PreInit(object sender, EventArgs e)
{
    Response.Write("This is PreInit.... <br/>");
}

protected void Page_Init(object sender, EventArgs e)
{
    Response.Write("This is Init... <br/>");
}

protected void Page_InitComplete(object sender, EventArgs e)
{
    Response.Write("This is InitComplte... <br/>");
}

protected void Page_PreLoad(object sender, EventArgs e)
{
    Response.Write("This is PreLoad... <br/>");
}

protected void Page_Load(object sender, EventArgs e)
{
    Response.Write("This is Load... <br/>");

    Response.Write("IsPostback: " + IsPostBack + " <br/>");

}

protected void Page_LoadComplete(object sender, EventArgs e)
{
    Response.Write("This is LoadComplete... <br/>");
}

protected void Page_PreRender(object sender, EventArgs e)
{
    Response.Write("This is PreRender... <br/>");
}

protected void Page_RenderComplete(object sender, EventArgs e)
{
    Response.Write("This is RenderComplete... <br/>");
}

protected void Page_Unload(object sender, EventArgs e)
{
    //Response.Write("This is Unload... <br/>");
}

protected void Button1_OnClick(object sender, EventArgs e)
{
    Response.Write("This is Button1_OnClick.... <br/>");
}

0voto

o.k.w Punkte 24819

Sie müssen das Hinzufügen des neuen TextBox-Steuerelements vor Page_Load platzieren (z.B. innerhalb von Page_Init, aber nicht vorher).

Der Standardwert der 'statischen' TextBox muss nur einmal initialisiert werden (z.B. innerhalb von ! IsPostback ) von Page_Load .

Werfen Sie einen Blick auf Lebenszyklus der Seite .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X