RaisePostBackEvent hat ein falsches Steuerelement aufgerufen

9

Ich habe zwei Tage mit einem anderen Kollegen verbracht, der das untersucht hat. Ich war überrascht, dass die meisten Lösungen, die dieses Problem diskutieren, entweder die falsche Lösung oder eine Lösung haben, die aus den falschen Gründen funktioniert.

Wir haben ein benutzerdefiniertes Schaltflächensteuerelement, das ein ServerClick-Ereignis auslösen muss, wenn es gedrückt wird. Hier ist der zusammengefasste Code:

%Vor%

Am Ende des Browsers verwendet der Code zwei dieser Schaltflächen

%Vor%

Das Problem: Das Ereignis wird nicht auf der Schaltfläche "Annehmen" ausgelöst. Das Debuggen zeigt, dass RaisePostBackEvent aufgerufen wurde, aber auf die Schaltfläche Schließen, der kein ServerClick -Handler angehängt ist, daher passiert nichts. Es werden keine Ereignishandler aufgerufen.

Hinweise:

  • Das Problem wird nicht angezeigt, wenn nur ein MyButton auf der Seite vorhanden ist.
  • Wenn die Schaltflächen so angeordnet sind, dass die Schaltfläche "Akzeptieren" die letzte auf der Seite ist, beginnt sie zu arbeiten.
  • Wenn Sie die Schaltflächen außerhalb des Formular-Tags bewegen, werden die Ereignisse wie erwartet ausgeführt, und der Event-Handler für die Accept-Schaltflächen wird korrekt aufgerufen.
  • Das Implementieren von IPostBackDataHandler und das Aufrufen von RaisePostBackEvent() von IPostBackDataHandler::RaisePostDataChangedEvent() bewirkt, dass das Ereignis auf der Schaltfläche "Annehmen" innerhalb des Formular-Tags korrekt ausgelöst wird.
  • Der Aufruf von RegisterRequiresRaiseEvent(btnAccept) während PageLoad leitet Ereignisse korrekt an die Schaltfläche accept.

Die Frage:

Was ist die richtige Lösung von denen, die oben funktionieren? Oder gibt es eine andere Lösung? Wir müssen es so einrichten, dass mehrere Schaltflächen auf der Seite unabhängig von ihrer Reihenfolge oder Position auf der Seite unabhängige Klickereignisse auslösen können.

Meine Gedanken:

  • Dieses Problem scheint hier diskutiert zu werden: Ссылка
  • Man ist der Ansicht, dass das Aufrufen von __doPostback() mit der korrekten __EVENTTARGET das Ereignis automatisch korrekt auf die Schaltfläche umleiten sollte, aber das passiert in Wirklichkeit nicht. Es passiert nur, wenn wir auch IPostBackDataHandler implementieren. Viele Lösungen im Web scheinen auf __doPostback , UniqueID etc. als Täter zu verweisen, wenn tatsächlich IPostBackDataHandler implementiert wird, was scheinbar das Problem behebt.
  • Das Steuerelement implementiert IPostBackEventHandler , aber nicht IPostBackDataHandler . Ich denke, das ist richtig, weil das Steuerelement keine datengesteuerten Ereignisse auslösen muss. Die Implementierung von IPostBackDataHandler , um es zum Laufen zu bringen, scheint also ein Hack zu sein.
  • Die Verwendung von RegisterRequiresRaiseEvent ist nicht intuitiv und funktioniert außerdem nicht, wenn mehrere Schaltflächen auf der Seite Ereignisse auslösen möchten.
  • Ich frage mich, wie macht ein asp:Button es?
Ali 21.07.2015, 13:10
quelle

1 Antwort

0

Ich habe eine Situation simuliert. Ich hoffe es hilft. Es gibt die MyButton WebServerControl-Klasse:

%Vor%

Ich habe dann mein Webserver-Steuerelement in einem Projekt verwendet, sagen wir, das ist die default.aspx:

%Vor%

Und in default.aspx.cs habe ich einfach das Ereignis implementiert:

%Vor%

Der AcceptClickHandler wird nur ausgelöst, wenn Sie auf die Schaltfläche Akzeptieren klicken und nicht auf der Schaltfläche Schließen.
Entschuldigung, wenn ich das Problem nicht richtig verstanden habe.

    
tanuk 30.07.2015 16:15
quelle