Inkonsistentes Verhalten mit AJAX und Viewstate in .NET

stimmen
2

Ich finde, dass Schlagen die Schaltfläche „Aktualisieren“ in meinem Browser vorübergehend die Viewstate für die Kontrollen in einem Update vermasseln werden.

Hier ist meine Situation: Ich habe eine benutzerdefinierte WebControl gemacht, die Werte in der Viewstate speichert. Ich habe diese Kontrolle in einem Update. Als ich auf den „Aktualisieren“ in meinem Browser, wird es vorübergehend die Werte in Viewstate auszulöschen. Doch auf den nächsten Postbacks, die Werte, die in der Viewstate waren, bevor ich getroffen „refresh“ magische Weise wieder auftauchen.

Dieses Verhalten vermasselt meine webcontrol. Nachdem ich Hit „Refresh“, wird die Steuerung in den Ausgangszustand zurückgeführt, da die Viewstate leer ist und IsPostBack auf false gesetzt. Allerdings, wenn ich auf einem der Postbacks Kontrollen in meinem WebControl klicken, wird der WebControl mit den gleichen Werten neu zu laden, die in Viewstate waren, bevor ich getroffen „Refresh“.

Merkwürdigerweise geschieht dies nur, wenn ich AJAX bin mit. Als meine Kontrolle außerhalb eines Update ist, Firefox gibt mir es die Standard-Nachricht „Diese Seite anzuzeigen, müssen Firefox Informationen senden, die jede Aktion wiederholen (wie eine Suche oder Auftragsbestätigung), die früher durchgeführt wurde (erneut senden) (Abbrechen) .“ Das ist in Ordnung, weil zumindest das Verhalten konsistent ist. Allerdings muss ich unbedingt AJAX für dieses Projekt verwenden.

So ist es das, was würde ich tun - ich das „refresh“ Verhalten konsistent machen will. Am besten wäre es, wenn schlagen „refresh“ nicht den Viewstate überhaupt beeinflussen. Aber wenn es hat die Viewstate auszulöschen, das ist in Ordnung, solange die Viewstate BLEIBT löscht. Keine dieser Sachen mit Werten verschwinden und wieder auftauchen.

Ach ja, und hier ist mein Beispielcode:

using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

namespace TestControls
{
    public class TestControl : WebControl
    {
        int _clickCount;
        bool _mustUpdate;

        protected override void LoadViewState(object savedState)
        {
            base.LoadViewState(savedState);

            _clickCount = ((int)ViewState[clickCount]);
            _mustUpdate = ((bool)ViewState[mustUpdate]);
        }

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            Controls.Clear();
            ControlCreator();
        }

        private void ControlCreator()
        {
            Label tempLabel = new Label();
            LiteralControl tempLiteral = new LiteralControl(<br/><br/>);
            LinkButton tempLink = new LinkButton();

            tempLink.ID = testLink;
            tempLink.Text = Click me!;
            tempLink.Click += new EventHandler(tempLink_Click);

            tempLabel.ID = testLabel;
            tempLabel.Text = _clickCount.ToString();

            Controls.Add(tempLabel);
            Controls.Add(tempLiteral);
            Controls.Add(tempLink);
        }

        void tempLink_Click(object sender, EventArgs e)
        {
            _clickCount++;
            _mustUpdate = true;
        }

        protected override void OnPreRender(EventArgs e)
        {
            base.OnPreRender(e);

            if (_mustUpdate)
            {
                Controls.Clear();
                ControlCreator();

                _mustUpdate = false;
            }
        }

        protected override object SaveViewState()
        {
            ViewState[clickCount] = _clickCount;
            ViewState[mustUpdate] = _mustUpdate;

            return base.SaveViewState();
        }
    }
}
Veröffentlicht am 09/12/2008 um 21:50
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
1

Ich habe gerade wieder lesen Ihre Frage und erkannte ich etwas verpasst ...

Sie schlagen die Browser - Taste aktualisieren!

Ist das ein Problem? JA!

Was passiert, wenn Sie den Refresh-Button im Browser schlagen? Es erfrischt die aktuelle Seite. Wenn es ein Postback ist, wird es die Post-Daten erneut zu senden.

Die AJAX-Rückruf kann die Viewstate aktualisieren, soweit die Seite betroffen ist, aber der Browser Refresh-Button schlagen wird re-post die alte Viewstate.

Es gibt eine Fülle wird die Diskussion über die Angelegenheit dem Sie Google.

Eine sehr einfache Idee ist vielleicht speichern die Informationen in Sitzungsstatus stattdessen vielleicht. Auch das kann auch natürlich auch sein eigenes Problem. Aber es kann Ihr unmittelbares Ziel erreichen.

Ein Tipp für die Geschichte eines Postbacks Abwischen (die Wieder Post zu verhindern) ist wieder zurück auf die gleiche Seite zu umleiten.

Beantwortet am 12/12/2008 um 14:19
quelle vom benutzer

stimmen
1

Versuche Folgendes...

    protected override void LoadViewState(object savedState)
    {
        if (savedState != null)
        {
            object[] myState = (object[])savedState;

            if (myState[0] != null) base.LoadViewState(myState[0]);
            if (myState[1] != null) _clickCount = ((int)myState[1]);
            if (myState[2] != null) _mustUpdate = ((bool)myState[2]);
        }
    }

    protected override object SaveViewState()
    {
        object[] allStates = new object[3];

        allStates[0] = base.SaveViewState();
        allStates[1] = _clickCount;
        allStates[2] = _mustUpdate;

        return allStates;
    }

Grundsätzlich abgeleitet von dem obigen Code Control.LoadViewState Methode und Control.SaveViewState Methode von MSDN.

Beantwortet am 10/12/2008 um 00:27
quelle vom benutzer

stimmen
0

Ihre Viewstate wird nicht gespeichert werden. Die Saveüberschreibung ist für Objekte zu speichern, nicht für Sachen in die Tasche stecken Viewstate. Die Viewstate Tasche ist bereits über den Punkt der mnarking Sache schmutzig und Änderungen, die Sie nicht beibehalten machen wird. Sie benötigen ein Objekt-Array zu laden / sehen die Viewstate Informationen zu erstellen.

Tun Sie, was BlackMael zeigt.

Beantwortet am 10/12/2008 um 00:32
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more