Verfolgen des Status mit ASP.NET AJAX / ICallbackEventHandler

Translate

Ich habe ein Problem mit der Aufrechterhaltung des Status auf einer ASP.NET AJAX-Seite. Kurzversion: Ich benötige eine Möglichkeit, die Seite ViewState nach einem asynchronen Rückruf zu aktualisieren, um alle Statusänderungen widerzuspiegeln, die der Server während des asynchronen Aufrufs vorgenommen hat.

Dies scheint ein häufiges Problem zu sein, aber ich werde mein Szenario beschreiben, um Folgendes zu erklären:

Ich habe ein gitterartiges Steuerelement, das einige JavaScript-Verbesserungen aufweist - nämlich die Möglichkeit, Spalten und Zeilen per Drag & Drop zu verschieben. Wenn eine Spalte oder Zeile an einer neuen Position abgelegt wird, wird eine AJAX-Methode aufgerufen, um das Steuerelement serverseitig zu benachrichtigen und ein entsprechendes serverseitiges Ereignis auszulösen ("OnColumnMoved" oder "OnRowMoved").

ASP.NET AJAX-Aufrufe senden standardmäßig die gesamte Seite als Anforderung. Auf diese Weise durchläuft die Seite einen vollständigen Lebenszyklus, der Ansichtsstatus bleibt erhalten und der Status des Steuerelements wird wiederhergestellt, bevor die RaiseCallbackEvent-Methode aufgerufen wird.

Da der AJAX-Aufruf die Seite jedoch nicht aktualisiert, spiegelt der ViewState die Seite widerOriginalStatus des Steuerelements, auch nachdem die Spalte oder Zeile verschoben wurde. Wenn also zum zweiten Mal eine clientseitige Aktion ausgeführt wird, wird die AJAX-Anforderung an den Server gesendet und die Seite und das Steuerelement werden erneut erstellt, um das zu berücksichtigenzuerstStatus des Steuerelements, nicht der Status nach dem Verschieben der ersten Spalte oder Zeile.

Dieses Problem erstreckt sich auf viele Implikationen. Wenn wir beispielsweise eine clientseitige / AJAX-Aktion zum Hinzufügen eines neuen Elements zum Raster haben und dann eine Zeile gezogen wird, wird das Raster serverseitig mit einem Element weniger als auf der Clientseite erstellt.

Und schließlich und für mein spezielles Beispiel ist das eigentliche Datenquellenobjekt, auf das wir reagieren, auf der Seite ViewState gespeichert. Dies war eine Entwurfsentscheidung, um die Aufbewahrung einer statusbehafteten Kopie der manipulierten Daten zu ermöglichen, die entweder nach vielen Manipulationen an DB übergeben oder verworfen werden können, wenn der Benutzer zurücktritt. Das ist sehr schwer zu ändern.

Daher muss die Seite ViewState beim Rückruf nach dem Auslösen der AJAX-Methode erneut aktualisiert werden.

This question and all comments follow the "Attribution Required."

Alle Antworten

Translate

Wenn Sie den ViewState ohnehin schon mischen, können Sie auch ein UpdatePanel verwenden. Seine teilweisen PostbackswerdenAktualisieren Sie den ViewState der Seite automatisch.

Quelle
Translate

Schauen Sie sich diesen Blog-Beitrag an:Optimieren von ICallbackEventHandler und Viewstate. Der Autor scheint genau die Situation anzusprechen, in der Sie sich befinden:

Wenn Sie ICallbackEventHandler verwenden, müssen Sie zwei Hindernisse überwinden, um die Statusverwaltung für Rückrufe zu aktualisieren. Erstens ist das Problem des schreibgeschützten Ansichtszustands. Der andere registriert tatsächlich die Änderungen, die der Benutzer an der Seite vorgenommen hat, bevor der Rückruf ausgelöst wird.

Im Blog-Beitrag finden Sie seine Vorschläge zur Lösung dieses Problems. Schauen Sie sich das auch anForumsbeitragdas bespricht das gleiche Problem auch.

Quelle
Translate

Ich habe tatsächlich beide von Ihnen bereitgestellten Links gefunden, aber wie bereits erwähnt, beschreiben sie lediglich das Problem und lösen es nicht. Der Autor des Blogposts schlägt eine Problemumgehung vor, indem er einen anderen ViewState-Anbieter verwendet. Leider ist dies in diesem Fall nicht möglich. Ich muss die Details des ViewState wirklich in Ruhe lassen und mich einfach an das halten, was gerade getan wird Out-of-the-Box.

Quelle
Translate

Ich fand eine ziemlich elegante Lösung mitRadAjaxManager von Telerik. Es funktioniert ganz gut, im Wesentlichen registrieren Sie jedes Steuerelement, das möglicherweise ein Postback aufruft, und registrieren dann jedes Steuerelement, das neu gezeichnet werden soll, nachdem dieses Postback asynchron ausgeführt wurde. Der RadAjaxManager aktualisiert das DOM nach dem asynchronen Postback und schreibt den ViewState und alle betroffenen Steuerelemente neu. Nachdem ich einen Blick in Reflector geworfen habe, sieht es unter der Motorhaube etwas klobig aus, aber es passt zu meinen Zwecken.

Quelle
Translate

Ich verstehe nicht, warum Sie dafür ein benutzerdefiniertes Steuerelement verwenden würden, wenn das integrierte ASP.NET AJAX UpdatePanel dasselbe tut.

Es erhöht lediglich die Komplexität, bietet Ihnen weniger Unterstützung und erschwert es anderen, an Ihrer App zu arbeiten.

Quelle