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:
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. 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:
__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. 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. RegisterRequiresRaiseEvent
ist nicht intuitiv und funktioniert außerdem nicht, wenn mehrere Schaltflächen auf der Seite Ereignisse auslösen möchten. asp:Button
es? 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.
Tags und Links asp.net user-controls custom-controls