
Έχω ένα πρόβλημα με τη διατήρηση της κατάστασης σε μια σελίδα ASP.NET AJAX. Σύντομη έκδοση: Χρειάζομαι κάποιο τρόπο να ενημερώσετε το ViewState σελίδα μετά από μια επανάκλησης ασύγχρονη έχει γίνει, ώστε να αντικατοπτρίζει οποιαδήποτε κατάσταση αλλάζει το διακομιστή έκανε κατά τη διάρκεια της κλήσης ασύγχρονη.


Αυτό φαίνεται να είναι ένα κοινό πρόβλημα, αλλά θα περιγράψω το σενάριο μου για να εξηγήσει:


Έχω ένα πλέγμα που μοιάζει με τον έλεγχο που έχει κάποιες βελτιώσεις JavaScript - δηλαδή, η δυνατότητα να drag and drop στήλες και γραμμές. Όταν μια στήλη ή σειρά ρίπτεται σε μια νέα θέση, γίνεται επίκληση μία μέθοδος AJAX να κοινοποιήσει την πλευρά του διακομιστή ελέγχου φωτιάς και ένα αντίστοιχο server-side event ( «OnColumnMoved» ή «OnRowMoved»).


ASP.NET AJAX κλήσεις, εξ ορισμού, να στείλετε ολόκληρη τη σελίδα ως αίτημα. Με αυτόν τον τρόπο η σελίδα περνά μέσα από μια πλήρη κύκλο ζωής, viewstate είναι συνεχίστηκε και η κατάσταση του ελέγχου αποκατασταθεί πριν από την επίκληση της μεθόδου RaiseCallbackEvent.


Ωστόσο, δεδομένου ότι η κλήση AJAX δεν ενημερώνει τη σελίδα, το ViewState αντικατοπτρίζει την *αρχική* κατάσταση του ελέγχου, ακόμη και μετά τη στήλη ή γραμμή έχει μετακινηθεί. Έτσι, η δεύτερη φορά που συμβαίνει ένα client-side δράση, η αίτηση AJAX πηγαίνει στο διακομιστή και η σελίδα και ελέγχου είναι χτισμένα πίσω πάλι να αντανακλούν την *πρώτη* κατάσταση του ελέγχου, όχι το κράτος μετά την πρώτη στήλη ή γραμμή κινήθηκε.


Αυτό το πρόβλημα εκτείνεται σε πολλές επιπτώσεις. Για παράδειγμα, αν έχουμε ένα client-side / AJAX δράση για να προσθέσετε ένα νέο στοιχείο με το δίκτυο, και στη συνέχεια μια σειρά σέρνεται, το δίκτυο είναι ενσωματωμένο server-side με ένα λιγότερο στοιχείο από ό, τι στην πλευρά του πελάτη.


Και, τέλος, και πιο σοβαρά για συγκεκριμένο παράδειγμα μου, το πραγματικό αντικείμενο προέλευσης δεδομένων που ενεργούν κατόπιν αποθηκεύεται στη σελίδα ViewState. Αυτή ήταν η απόφαση του σχεδιασμού για να επιτρέψει τη διατήρηση ενός stateful αντίγραφο της χειραγωγείται δεδομένα τα οποία μπορούν είτε να δεσμευτεί για την DB μετά από πολλούς χειρισμούς ή να απορριφθεί αν ο χρήστης πλάτη έξω. Αυτό είναι πολύ δύσκολο να αλλάξει.


Έτσι, και πάλι, χρειάζομαι έναν τρόπο για το ViewState σελίδα να ενημερωθεί για επανάκληση μετά την μέθοδο AJAX ψήνεται.

 
κατάσταση παρακολούθησης χρησιμοποιώντας ASP.NET AJAX / ICallbackEventHandler
=============================================================================



Αν είστε ήδη ανακάτεμα της ViewState γύρω ούτως ή άλλως, ίσως και να χρησιμοποιήσετε ένα UpdatePanel. Μερική postbacks της **θα** ενημερώσει ViewState της σελίδας αυτόματα.

 

Ελέγξτε έξω αυτό το blog post: [Μικροαλλαγές την ICallbackEventHandler και Viewstate](http://www.reimers.dk/blogs/jacob_reimers_weblog/archive/2007/03/23/tweaking-the-icallbackeventhandler-and-viewstate.aspx) . Ο συγγραφέας φαίνεται ότι αντιμετωπίζει την ίδια κατάσταση που αντιμετωπίζετε:



> 
> Έτσι, κατά τη χρήση ICallbackEventHandler έχετε δύο εμπόδια να ξεπεραστούν για να έχουν ενημερωθεί διαχείριση του κράτους για επιστροφές κλήσεων. Πρώτο είναι το πρόβλημα της ανάγνωσης-μόνο viewstate. Ο άλλος είναι στην πραγματικότητα εγγραφή των αλλαγών που ο χρήστης έχει κάνει στην σελίδα πριν την ενεργοποίηση της επιστροφής κλήσης.
> 
> 
> 


Δείτε την ανάρτηση στο blog για τις προτάσεις του για το πώς να λύσει αυτό. Επίσης, ελέγξτε έξω αυτό το [μήνυμα στο φόρουμ](http://forums.asp.net/t/1128218.aspx) που ασχολείται με το ίδιο πρόβλημα.

 

Βρήκα στην πραγματικότητα και οι δύο από αυτές τις συνδέσεις που παρέχονται, αλλά όπως σημειώνεται είναι απλά περιγράφουν το πρόβλημα, δεν είναι λύση. Ο συντάκτης του ιστολογίου προτείνει μια λύση, χρησιμοποιώντας ένα διαφορετικό πάροχο ViewState, αλλά δυστυχώς αυτό δεν είναι μια δυνατότητα σε αυτή την περίπτωση ... Θα πρέπει πραγματικά να αφήσει τα στοιχεία του ViewState μόνο και μόνο γάντζο σε ό, τι γίνεται έξω από το κουτί.

 

Βρήκα μια αρκετά κομψή λύση με [RadAjaxManager Telerik του](http://www.telerik.com/demos/aspnet/prometheus/Ajax/Examples/Common/ViewState/DefaultCS.aspx) . Δουλεύει αρκετά καλά, κατ 'ουσίαν την εγγραφή σας σε κάθε έλεγχο που μπορεί να επικαλεστεί την καταχώρηση προς τα πίσω, και στη συνέχεια να εγγραφείτε σε κάθε έλεγχο που θα πρέπει να είναι εκ νέου που μετά από αυτό postback εκτελείται ασύγχρονα. Η RadAjaxManager θα ενημερώσει το DOM μετά την postback ασύγχρονη και ξαναγράψουμε το ViewState και όλα επηρεάζονται ελέγχους. Μετά τη λήψη μια ματιά στο ανακλαστήρα, φαίνεται λίγο kludgy κάτω από την κουκούλα, αλλά ταιριάζει σκοπούς μου.

 

Δεν καταλαβαίνω γιατί θα πρέπει να χρησιμοποιήσετε ένα προσαρμοσμένο στοιχείο ελέγχου για το ότι, όταν ο ενσωματωμένες ASP.NET AJAX UpdatePanel κάνει το ίδιο πράγμα.


Προσθέτει μόνο μεγαλύτερη πολυπλοκότητα, σας δίνει λιγότερη υποστήριξη, και καθιστά πιο δύσκολο για τους άλλους να εργαστούν για την εφαρμογή σας.

 