Vă mulțumim pentru susținere

Starea de urmărire utilizând ASP.NET AJAX / ICallbackEventHandler

Am o problemă cu menținerea stării într-o pagină ASP.NET AJAX. Versiune scurtă: Am nevoie de un mod de a actualiza pagina ViewState după ce a fost efectuat un apel de asincronizare, pentru a reflecta modificările de stare pe care le-a făcut serverul în timpul apelului asincron.

Aceasta pare a fi o problemă obișnuită, dar îmi voi descrie scenariul pentru a explica:

Am un control asemănător grilei, care are unele îmbunătățiri JavaScript - și anume, capacitatea de a glisa și picătură coloane și rânduri. Atunci când o coloană sau un rând este scos într-o nouă poziție, se invocă o metodă AJAX pentru a notifica serverul de control și a declanșa un eveniment corespunzător de pe server ("OnColumnMoved" sau "OnRowMoved").

ASP.NET AJAX solicită, în mod implicit, să trimită întreaga pagină ca cerere. În acest fel, pagina trece printr-un ciclu complet de viață, vizualizarea este persistată și starea controlului este restabilită înainte ca metoda RaiseCallbackEvent să fie invocată.

However, since the AJAX call does not update the page, the ViewState reflects the original state of the control, even after the column or row has been moved. So the second time a client-side action occurs, the AJAX request goes to the server and the page & control are built back up again to reflect the first state of the control, not the state after the first column or row was moved.

Această problemă se extinde la numeroase implicații. De exemplu, dacă avem o acțiune client-side / AJAX pentru a adăuga un element nou în grila și apoi un rând este tras, grila este construită pe partea de server cu un element mai puțin decât pe partea clientului.

And finally & most seriously for my specific example, the actual data source object we are acting upon is stored in the page ViewState. That was a design decision to allow keeping a stateful copy of the manipulated data which can either be committed to DB after many manipulations or discarded if the user backs out. That is very difficult to change.

Deci, din nou, am nevoie de o modalitate prin care pagina ViewState să fie actualizată la apelul de apel după ce metoda AJAX este declanșată.

0
adăugat editat

5 răspunsuri

Am găsit de fapt ambele legături pe care le-ați furnizat, dar, așa cum am notat, ele descriu pur și simplu problema și nu o rezolvă. Autorul postării pe blog sugerează o soluție folosind un furnizor diferit de ViewState, dar, din nefericire, aceasta nu este o posibilitate în acest caz ... Chiar trebuie să lăsăm doar detaliile din ViewState și să fiu doar la ceea ce se face afara din cutie.

0
adăugat

Am gasit o solutie destul de eleganta cu RadijaxManager al lui Telerik . Funcționează destul de frumos, în esență, înregistrați fiecare control care ar putea invoca un postback și apoi înregistrați fiecare control care ar trebui să fie redactat după ce postback-ul este efectuat asincron. RadAjaxManager va actualiza DOM după postback-ul asincron și va rescrie vizualizarea și toate comenzile afectate. După ce a aruncat o privire în Reflector, arăta un pic mai prost sub capotă, dar mi se potrivește scopurile.

0
adăugat

Dacă deja amestecați ViewState oricum, este posibil să utilizați și un UpdatePanel. Postback-urile sale parțiale vor să actualizeze în mod automat pagina ViewState a paginii.

0
adăugat

Nu înțeleg de ce ați folosi un control personalizat pentru asta, atunci când ASP.NET AJAX UpdatePanel încorporat face același lucru.

Pur și simplu adaugă o complexitate mai mare, vă oferă mai puțină asistență și o face mai dificilă pentru alții să lucreze la aplicația dvs.

0
adăugat

Consultați acest post pe blog: Optimizați ICallbackEventHandler și Viewstate . Autorul pare să se adreseze exact situației pe care o întâlniți:

Deci, atunci când utilizați ICallbackEventHandler, aveți două obstacole în calea depășirii pentru a avea gestionarea actualizată a statului pentru apelurile de apel. Prima este problema vizualizării numai pentru citire. Celălalt înregistrează efectiv modificările efectuate de utilizator pe pagină înainte de declanșarea apelului.

Consultați articolul de pe blog pentru sugestiile sale despre cum să rezolvați acest lucru. De asemenea, verificați acest post de forum care discută aceeași problemă.

0
adăugat