Definition von __doPostBack erzwingen

February 15, 2008 at 2:13 PMAndre Loker

Das Problem

Zwei aspx-Seiten, beide rufen den identischen JavaScript Code auf:

   1: function postBackHiddenField(hiddenFieldID) {
   2:     var hiddenField = $get(hiddenFieldID);
   3:     if (hiddenField) {
   4:         hiddenField.value = (new Date()).getTime();
   5:         __doPostBack(hiddenFieldID,'');
   6:     }
   7: }

Auf Seite A funktioniert der JS Code, auf Seite B nicht. Bei letzterem sagt der JavaScript-Debugger:

__doPostBack not defined

(Hoffentlich) verständlicherweise verursachte das bei mir ziemliches Kopfkratzen. __doPostBack sollte ja eigentlich auf einer ASPX Seite nicht fremd sein. Bis mir auf einmal siedendheiß einfiel, dass ASP.NET vielleicht so schlau ist, und nur dann die enstprechenden Script-Dateien inkludiert, wenn tatsächlich ein Control auch ein Postback via JavaScript ausführen kann. Auf Seite A war so ein Control vorhanden, auf Seite B jedoch nicht. Demzufolge wurde für Seite B der Code für __doPostBack nicht in die Seite eingepflegt.

Der Quick-Fix

Um das Problem zu lösen, reicht es schon aus, einfach ein Control einzufügen, dass einen Postback mittels JavaScript auslöst, wie etwa ein LinkButton. Dieser muss auf der Client Seite nicht zwingend sichtbar sein, d.h. man kann ihn clientseitig ausblenden:

   1: <asp:LinkButton runat="server" Style='display: none;' ID="enablesJSPostBack" />

Achtung: es funktioniert nicht, wenn man den LinkButton schon serverseitig ausblendet mit Visible="false"! In dem Fall erzeugt ASP.NET ebenfalls den nötigen Code für __doPostBack nicht.

Technische Details und eine elegantere Lösung

Ich habe ein wenig mit Hilfe von Reflector im Gedärm von ASP.NET gewühlt um nachzusehen, unter welchen Umständen der __doPostBack-Code gerendert wird. Womöglich gibt es eine Methode, mit der man eben dieses erreichen kann, ohne ein Control in der Seite erstellen zu müssen. Entscheidend ist die Methode RegisterPostBackScript der Page-Klasse. Wird sie angerufen erzeugt die Seite den __doPostBack Code. Leider ist die Methode internal. Allerdings wird die Methode unter anderem aufgerufen, wenn man ClientScript.GetPostBackEventReference anruft. Mit dieser Methode kann man den __doPostBack Script-Code erzeugen, der einen Script-seitiges Postback ausführt. Ich habe meiner Page-Klasse folgende Methode hinzugefügt, um (ohne zusätzliche Controls) sicher zu stellen, dass das __doPostBack-Script erzeugt wird:

   1: protected void EnsureDoPostBackDefined(){
   2:     ClientScript.GetPostBackEventReference(this, string.Empty);
   3: }

Die Methode EnsureDoPostBackDefined wird einfach z.B. im Load Ereignis aufgerufen und schon klappt es mit __doPostBack.

Posted in: ASP.NET | Snippets

Tags: ,

Comments (1) -

Hat geholfen, vielen Dank.