wake-up-neo.com

ASP .NET Button-Ereignishandler werden nicht beim ersten Klick ausgelöst, sondern beim zweiten Klick nach einem PostBack

Background: Ich passe eine vorhandene ASP .NET/C # -Anwendung an. Sie hat ein eigenes kleines "Framework" und Konventionen, die Entwickler beim Erweitern/Anpassen ihrer Funktionalität beachten müssen Ich erweitere derzeit einige seiner Verwaltungsfunktionen, für die das Framework einen Vertrag zur Durchsetzung der Implementierung der GetAdministrationInterface() -Methode bereitstellt, die System.Web.UI.Control Zurückgibt. Diese Methode wird während der Page_Load() Methode der Seite, auf der sich die GUI-Oberfläche befindet.

Problem: Ich habe drei Schaltflächen in meiner Benutzeroberfläche, denen jeweils ein Ereignishandler zugewiesen wurde. Meine Administrations-GUI wird einwandfrei geladen, aber das Klicken auf eine der Schaltflächen entspricht nicht den Erwartungen. Wenn ich sie jedoch ein zweites Mal anklicke, funktionieren die Schaltflächen.

Ich habe zu Beginn jeder Event-Handler-Methode Haltepunkte gesetzt und meinen Code schrittweise durchgearbeitet. Beim ersten Klick wurde keiner der Event-Handler ausgelöst. Beim zweiten Klick feuerten sie.

Irgendwelche Ideen?

Beispiel für eine Schaltflächendefinition (innerhalb von GetAdministrationInterface)

public override Control GetAdministrationInterface()
{
    // more code...

    Button btn = new Button();
    btn.Text = "Click Me!";
    btn.Click += new EventHandler(Btn_Click);

    // more code...
}

Beispiel für die Definition einer Event-Handler-Methode

void Btn_Click(object sender, EventArgs e)
{
    // Do Something
}

Page_Load Methode, die GetAdministrationInterface aufruft

protected void Page_Load(object sender, System.EventArgs e)
{
    if (!Page.IsAsync)
    {
        List<AdministrationInterface> interfaces = <DATABASE CALL>;
        foreach(AdministrationInteface ai in interfaces)
        {
            placeholderDiv.Controls.Add(ai.GetAdministrationInterface());
        }
    }
}
36
John

Guter Kummer! Ich wusste, dass es etwas so Dummes werden würde. Rein mein Fehler natürlich und meine Unkenntnis in ASP .NET.

Nachdem ich eine Vielzahl von Google-Suchanfragen durchgeführt hatte und schließlich von Google wegen des Verdachts, ein Bot zu sein, der automatisierte Skripte ausführt, blockiert worden war, gelang es mir, eine letzte Suche durchzuführen, und ich stolperte über diese Artikel . Schon als ich aufgab, versuchte ich mein Bestes, den Artikel zu lesen, ohne 10 Zeilen auf einmal zu überspringen oder nach hübschen Bildern zu suchen. In dem Abschnitt mit dem Titel Zuweisen von IDs zu dynamisch erstellten Steuerelementen las ich diese magischen und freudigen Worte:

Wenn Sie den Quell-HTML-Code anzeigen, bevor Sie auf die nicht funktionierende Schaltfläche klicken, und nachdem Sie darauf geklickt haben, werden Sie einen kleinen Unterschied feststellen. Die Schaltflächen haben vor und nach dem Post-Back unterschiedliche HTML-IDs. Ich habe Ctl04 und Ctl05 vor dem Post-Back und Ctl02 und Ctl03 nach dem Post-Back.

Die ASP.NET-Schaltfläche erkennt Ereignisse, indem in der Request.Form-Auflistung nach einem Wert für ihre ID gesucht wird. (In Wahrheit geschieht dies anders und die Steuerelemente überprüfen die Request.Form-Erfassung nicht selbst. Die Seite übergibt die Post-Daten anhand ihrer IDs an die Steuerelemente und an die Steuerelemente, die registriert sind, um über die Post-Daten benachrichtigt zu werden.) ASP.NET löst das Click-Ereignis nicht aus, da sich die ID der Schaltfläche zwischen den Post-Backs geändert hat. Die Schaltfläche, auf die Sie geklickt haben, und die nachfolgende Schaltfläche sind unterschiedliche Schaltflächen für ASP.NET.

Sicher genug, als ich den HTML-Code zum ersten Mal ansah, hatte meine Schaltfläche die ID ctl04$ctl36. Nach dem Klicken auf den Button hatte mein Button die ID ctl04$ctl33.

Also da hast du es! Alles, was ich tun musste, war die ID auf den Tasten und Presto! Meine Event-Handler werden jetzt gerufen!

Probelösung:

public override Control GetAdministrationInterface()
{
    // more code...

    Button btn = new Button();
    btn.Text = "Click Me!";
    // !!THE BANE OF MY EXISTENCE!!
    btn.ID = "The_Bane_of_My_Existence";
    // !!THE BANE OF MY EXISTENCE!!
    btn.Click += new EventHandler(Btn_Click);

    // more code...
}

Was für eine großartige Art, zwei Tage zu verbringen ...

66
John

Ich hatte das gleiche Problem, aber die akzeptierte Antwort hier verursachte es nicht. Ich hatte ein Textfeld und eine Suchschaltfläche und beim ersten Klicken auf die Schaltfläche wurde die Suche nicht ausgeführt. Der Event-Handler des Buttons wurde nicht getroffen. Ein erneutes Klicken auf die Schaltfläche löste jedoch das Ereignis auf dem Server aus. Hier ist warum:

Wenn Sie ein <asp:Textbox> Haben, dessen AutoPostBack auf true gesetzt ist, nachdem Sie das Textfeld eingegeben und dann auf eine Schaltfläche geklickt haben, wird im Textfeld sofort ein Post-Back ausgeführt in dem Moment verliert es den Fokus. Das Klicken auf die Schaltfläche zählt also nicht (die Seite ist aufgrund des Ereignisses im Textfeld bereits zurückgesetzt). Wenn Sie ein zweites Mal auf die Schaltfläche klicken, funktioniert dies, da das Textfeld nicht am zweiten Post-Back beteiligt ist.

Setzen Sie die Eigenschaft AutoPostBack von <asp:Textbox> Auf false, um dieses Problem zu beheben.

18
TheAgent

Eine schnelle Lösung besteht darin, eine ID für das ASCX-Steuerelement festzulegen, das Sie auf eine Seite laden. Wenn Ihr Code beispielsweise wie folgt lautet:

        UserControl SpecsControl = (UserControl)Page.LoadControl("../name.ascx");
        SpecsContainer.Controls.Add(SpecsControl);

dann müssen Sie eine Zeile hinzufügen (vor Controls.Add):

            SpecsControl.ID = "Aribtrary_Name";

Dann wird Ihre Handlermethode beim ersten Klick ausgelöst.

5
Farshid

Für mich war es das UpdatePanel, mein Button und meine TextBox befanden sich beide in einem UpdatePanel, also verursachte es ein seltsames Verhalten, als ich zurückging. Es hat es außerhalb von UpdatePanel genommen und das hat es behoben.

1
JAN

Ich hatte das gleiche Problem. Mein Knopf fror nach meinem ersten Klick ein. Für mich wurde dieses ärgerliche Problem gelöst, als ich das EnableViewState -Attribut des Buttons deaktivierte.

1
Gohan

Sogar ich hatte das gleiche Problem. Die Ursache war "localhost: 1656/secure/login.aspx? ReturnUrl =% 2f". Wenn die Anforderung % 2f als Abfragezeichenfolge enthält, ist der erste Beitrag nicht erfolgreich, obwohl "% 2f" für "/" steht.

eine Möglichkeit, dies zu vermeiden, indem eine Zustandsüberprüfung in pageload durchgeführt wird

protected void Page_Load(object sender, EventArgs e)
{
    string queryString = Request.QueryString.ToString();
    if(queryString == "ReturnUrl=%2f")
    {
        Response.Redirect("/secure/login.aspx");
    }
}
0
user2196633

Obwohl es schwierig ist, genau zu wissen, ohne die vollständige Pageload-Methode zu kennen, riecht es ein wenig, als würden sich die Event-Handler erst anschließen, wenn die Seite neu geladen wird.

z.B:

if (IsPostBack) {
    // Add handlers here ...
}
0
Simon Rigby

Ich hatte das gleiche problem Und ich suchte im Internet, ich habe keine Lösung gefunden. Danach habe ich Beispielcode gefunden und verwendet. Es hat bei mir funktioniert. Der Link zur Website ist unten:

http://www.c-sharpcorner.com/UploadFile/abhikumarvatsa/calling-an-Asp-Net-C-Sharp-method-web-method-using-javascript/

0
Mahmut EFE