Frage

Ich habe ein Problem mit der Statusverwaltung auf einer ASP.NET AJAX-Seite.Kurzfassung:Ich brauche eine Möglichkeit, den ViewState der Seite zu aktualisieren, nachdem ein asynchroner Rückruf durchgeführt wurde, 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 es zu erklären:

Ich habe ein gitterartiges Steuerelement, das über einige JavaScript-Verbesserungen verfügt – 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 die Steuerungsserverseite zu benachrichtigen und ein entsprechendes serverseitiges Ereignis („OnColumnMoved“ oder „OnRowMoved“) auszulösen.

ASP.NET AJAX-Aufrufe senden standardmäßig die gesamte Seite als Anfrage.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 dies wider Original Status des Steuerelements, auch nachdem die Spalte oder Zeile verschoben wurde.Wenn also zum zweiten Mal eine clientseitige Aktion ausgeführt wird, geht die AJAX-Anfrage an den Server und die Seite und das Steuerelement werden wieder aufgebaut, um das wiederzugeben Erste Status des Steuerelements, nicht der Status nach dem Verschieben der ersten Spalte oder Zeile.

Dieses Problem hat viele Auswirkungen.Wenn wir beispielsweise eine clientseitige/AJAX-Aktion haben, um dem Raster ein neues Element hinzuzufügen, und dann eine Zeile gezogen wird, wird das Raster serverseitig mit einem Element weniger als auf der Clientseite erstellt.

Und schließlich – was für mein spezielles Beispiel am schwerwiegendsten ist – wird das eigentliche Datenquellenobjekt, auf das wir reagieren, im ViewState der Seite gespeichert.Dies war eine Entwurfsentscheidung, um die Aufbewahrung einer zustandsbehafteten Kopie der manipulierten Daten zu ermöglichen, die entweder nach vielen Manipulationen in die Datenbank übernommen oder verworfen werden kann, wenn der Benutzer einen Rückzieher macht.Das ist sehr schwer zu ändern.

Ich benötige also erneut eine Möglichkeit, den ViewState der Seite beim Rückruf zu aktualisieren, nachdem die AJAX-Methode ausgelöst wurde.

War es hilfreich?

Lösung

Wenn Sie den ViewState ohnehin schon verschieben, können Sie auch ein UpdatePanel verwenden.Seine teilweisen Postbacks Wille Aktualisieren Sie den ViewState der Seite automatisch.

Andere Tipps

Schauen Sie sich diesen Blogbeitrag an: Optimieren von ICallbackEventHandler und Viewstate.Der Autor scheint genau die Situation anzusprechen, die Sie gerade erleben:

Wenn Sie also ICallbackEventHandler verwenden, müssen Sie zwei Hindernisse überwinden, um über eine aktualisierte Statusverwaltung für Rückrufe zu verfügen.Erstens ist das Problem des schreibgeschützten Ansichtszustands.Die andere besteht darin, tatsächlich die Änderungen zu registrieren, die der Benutzer an der Seite vorgenommen hat, bevor der Rückruf ausgelöst wird.

Seine Lösungsvorschläge finden Sie im Blogbeitrag.Schauen Sie sich auch das an Forumsbeitrag wo auch das gleiche Problem besprochen wird.

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 Blogbeitrags schlägt eine Problemumgehung durch die Verwendung eines anderen ViewState-Anbieters vor, aber leider ist das in diesem Fall nicht möglich ... Ich muss die Einzelheiten des ViewState wirklich in Ruhe lassen und mich einfach auf das konzentrieren, was gerade gemacht wird sofort einsatzbereit.

Ich habe eine ziemlich elegante Lösung gefunden mit Teleriks RadAjaxManager.Es funktioniert ganz gut, im Wesentlichen registrieren Sie jedes Steuerelement, das ein Postback aufrufen könnte, 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 Haube etwas klobig aus, aber es passt zu meinen Zwecken.

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 Support und macht es für andere schwieriger, an Ihrer App zu arbeiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top