Ασυνεπής συμπεριφορά με AJAX και ViewState στη ΝΕΤ

ψήφοι
2

Βρίσκω ότι πατώντας το κουμπί «Ανανέωση» στο πρόγραμμα περιήγησης που θα βίδα προσωρινά το ViewState για τους ελέγχους μέσα σε ένα UpdatePanel.

Εδώ είναι η κατάσταση μου: Έκανα μια προσαρμοσμένη Webcontrol που αποθηκεύει τις τιμές στο ViewState. Έβαλα αυτό το στοιχείο ελέγχου μέσα σε ένα UpdatePanel. Όταν χτύπησα το κουμπί «Ανανέωση» στο πρόγραμμα περιήγησης, θα εξαλείψει προσωρινά τις τιμές σε ViewState. Ωστόσο, την επόμενη postback, οι τιμές που ήταν στο ViewState πριν χτύπησα «ανανεώσετε» μαγικά επανεμφανίζονται.

Αυτή η συμπεριφορά βίδες μέχρι Webcontrol μου. Μετά χτύπησα «ανανέωσης», ο έλεγχος επιστρέφει στην αρχική του κατάσταση, δεδομένου ότι το ViewState είναι άδειο και IsPostBack έχει οριστεί σε false. Ωστόσο, όταν κάνω κλικ σε έναν από τους ελέγχους postback μέσα Webcontrol μου, η Webcontrol θα φορτώσετε εκ νέου με τις ίδιες αξίες που είχαν ViewState πριν χτύπησα «ανανέωσης».

Παραδόξως, αυτό συμβαίνει μόνο όταν είμαι με τη χρήση AJAX. Όταν τον έλεγχό μου είναι έξω από την UpdatePanel, Firefox μου δίνει τυποποιημένο μήνυμα αυτό, το «Για να εμφανίσετε αυτή τη σελίδα, ο Firefox θα πρέπει να στέλνουν πληροφορίες που θα επαναλάβετε οποιαδήποτε ενέργεια (όπως μια αναζήτηση ή επιβεβαίωση της παραγγελίας) που πραγματοποιήθηκε νωρίτερα (Επανάληψη) (Ακύρωση) .» Αυτό είναι καλό, επειδή τουλάχιστον η συμπεριφορά είναι συνεπής. Ωστόσο, θα πρέπει οπωσδήποτε να χρησιμοποιήσετε AJAX για το έργο αυτό.

Έτσι, αυτό είναι ό, τι θα ήθελα να κάνω - Θέλω να κάνω τη συμπεριφορά «ανανέωση» συνεπής. Θα ήταν καλύτερα αν το χτύπημα «ανανέωση» δεν επηρέασε την ViewState καθόλου. Αλλά αν πρέπει να εξαλείψει το ViewState, αυτό είναι εντάξει, εφ 'όσον το ViewState μένει αφανίστηκαν. Κανένα από αυτά τα πράγματα με τις αξίες εξαφανίζονται και επανεμφανίζονται.

Ω ναι, και εδώ είναι το παράδειγμα μου κώδικα:

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();
        }
    }
}
Δημοσιεύθηκε 09/12/2008 στις 21:50
πηγή χρήστη
Σε άλλες γλώσσες...                            


3 απαντήσεις

ψήφοι
1

Απλά ξαναδιάβασε την ερώτησή σας και συνειδητοποίησα έχασα κάτι ...

Μπορείτε χτυπούν τα προγράμματα περιήγησης κουμπί ανανέωσης!

Είναι αυτό ένα πρόβλημα; ΝΑΙ!

Τι συμβαίνει όταν πατήσετε το κουμπί ανανέωσης στο πρόγραμμα περιήγησης; Δροσίζει την τρέχουσα σελίδα. Αν υπήρχε μια καταχώρηση προς τα πίσω, θα στείλουμε εκ νέου τα στοιχεία μετά.

Η επιστροφή κλήσης AJAX μπορεί να ενημερώσει το ViewState όσο η σελίδα αφορά όμως πατώντας το κουμπί ανανέωσης του προγράμματος περιήγησης θα ξανά μετά το παλιό ViewState.

Υπάρχει ένας πλούτος συζήτηση επί του θέματος το οποίο μπορείτε να το Google.

Μια πολύ απλή ιδέα είναι να αποθηκεύσετε ίσως τις πληροφορίες σε κατάσταση Σύνοδο αντ 'αυτού, ίσως. Και αυτό, επίσης, να έχει τη δική του έκδοση του πολύ φυσικά. Αλλά μπορεί να επιτευχθεί άμεσα το στόχο σας.

Μια συμβουλή για το σκούπισμα της ιστορίας της επιστροφής δεδομένων (για να αποφευχθεί η εκ νέου θέση) είναι να ανακατευθύνει πίσω στην ίδια σελίδα και πάλι.

Απαντήθηκε 12/12/2008 στις 14:19
πηγή χρήστη

ψήφοι
1

Δοκιμάστε την παρακάτω ...

    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;
    }

Βασικά προερχόμενα τον παραπάνω κώδικα από Μέθοδο Control.LoadViewState και Control.SaveViewState Μέθοδος από MSDN.

Απαντήθηκε 10/12/2008 στις 00:27
πηγή χρήστη

ψήφοι
0

ViewState σας δεν αποθηκεύεται. Η SaveViewState παράκαμψη είναι για την αποθήκευση ΑΝΤΙΚΕΙΜΕΝΑ, όχι για τη θέση πράγματα στην τσάντα ViewState. Η τσάντα ViewState είναι ήδη πέρα ​​από το σημείο της mnarking πράγματα βρώμικα και οι αλλαγές που κάνετε δεν θα επέμενε. Θα πρέπει να δημιουργήσετε μια σειρά αντικείμενο να φορτώσει / δείτε το ViewState πληροφορίες.

Κάνε ό, τι δείχνει BlackMael.

Απαντήθηκε 10/12/2008 στις 00:32
πηγή χρήστη

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