2009-03-09 6 views
0

Ich habe eine Verknüpfungsschaltfläche auf einer Seite, der Ereignishandler für das Klickereignis dieser Schaltfläche ruft eine Methode für ein Objekt auf, das wiederum einen Webservice aufruft, wenn der webservice gibt das Objekt zurück, das ein Ereignis auslöst, und ein Ereignishandler auf dem Seitencodebehind aktualisiert eine Beschriftung auf der Seite. Aus irgendeinem Grund zeigt das Etikett die Nachricht nicht an.ASP.net kann die Seite nicht vom Ereignishandler aktualisieren

Das hat mich verrückt gemacht und ich kann nichts über Google finden. jede Hilfe würde geschätzt werden.

Der Webservice wird asynchron aufgerufen, aber der Thread wird blockiert, bis er zurückkehrt. und das Ereignis "labels pre render" wird aufgerufen, nachdem sein Text vom Ereignishandler für Proxyobjekte festgelegt wurde.

Alle Aufrufe finden im selben Thread statt, alle Werte, die ich gesetzt habe, und nicht nur der Beschriftungstext im Event-Handler werden beim Auslösen des Pre-Render-Ereignisses auf ihre vorherigen Werte zurückgesetzt.

Antwort

0

Haben Sie dies in Ihrem Page_Load-Ereignis?

if (Page.IsPostBack) 
{ 
    return; 
} 

Wenn nicht, kann das Label nach dem Postback neu initialisiert werden.

0

Wird der Webdienst asynchron ausgeführt? Möglicherweise wird das Webservice-Ereignis nach dem Rendern der Seite ausgelöst. Haben Sie debugged, um sicherzustellen, dass der Label-Wert festgelegt wird?

3

Hier ist, was geschieht:

  • Der Benutzer klickt auf Ihre Link-Button
  • Der Browser sendet eine Postbacks Anfrage an den Webserver
  • Der Web-Server eine brandneue Instanz Ihrer Seite-Klasse erstellt und startet ein neuer Seitenlebenszyklus
  • Der Seitenlebenszyklus erledigt alle seine normalen Ladearbeiten.
  • Lebenszyklus der Seite der Event-Handling Bühne und läuft Ihr Click-Ereignis
  • Das Click-Ereignis ruft den Web-Service über den „Proxy“ Objekt erreicht man
  • Das Proxy-Objekt ruft den Webdienst asynchron und gibt
  • beschrieben
  • Das click-Ereignis gibt zurück, da es sonst nichts zu tun hat und ASP.Net freigibt, um den Seitenlebenszyklus fortzusetzen.
  • Der Zyklus Seite Leben beendet, so die Seite an den Browser gerendert wird
  • Der Benutzer die neue Seite sieht, aber das Etikett ist die gleiche, da der Web-Service-Aufruf noch nicht beendet hat
  • Web-Service-Aufruf liefert zu Ihrem Proxy-Objekt, das sein abgeschlossenen Ereignis auslöst
  • Ihre Event-Handler des Eigenschaft Text auf Ihrer Seite Klasse des Labels aktualisiert die bereits
  • Ihre Seite Instanz von dieser Anforderung ist so angeordnet, erbracht wurde.

Update:
Die OP aktualisiert seine Frage, nachdem ich dies geschrieben, um anzuzeigen, dass der Lebenszyklus Timing synchron gehalten wird. Stattdessen werde ich darauf hinweisen, dass Steuerelemente in ASP.Net nicht threadsicher sind, aber das Ereignis webservice completed wird von dem Thread aufgerufen, der im Hintergrund verwendet wird, um die asynchrone Anfrage und nicht den ursprünglichen Thread zu erstellen. Sie sollten Invoke das Steuerelement beim Festlegen der Eigenschaft.

+0

+1 für erklären async in solchen Details :) – annakata

+0

Erm, wie würde ich ein Label-Steuerelement aufrufen? – Rob

Verwandte Themen