Verwendung von __doPostBack ()

161

Ich versuche, mit ASP.NET ein asynchrones Postback zu erstellen __doPostBack(), habe aber keine Ahnung, wie das geht. Ich möchte Vanille-JavaScript verwenden.

Etwas Einfaches wie ein Klick auf eine Schaltfläche kann dazu führen, dass das __doPostBack()Ereignis ausgelöst wird. Ich versuche nur zu lernen, wie der Mechanismus funktioniert.

Michael Kerute
quelle
Mögliches Duplikat der Asychnronous Message Send Asp.net
Kris van der Mast
9
Zunächst einmal verursacht __doPostBack keine asynchrone Aktion, es sei denn, sie wird durch die Steuerung in UpdatePanel ausgelöst.
Ladislav Mrnka
Warum ist dies mit c # und Javascript markiert . Ich verstehe den Javascript- Teil, aber nicht den c # -Teil.
Solomon Ucko
1
@Solomon Ucko - weil __doPostBack () bewirkt, dass die Seite zu ihrer serverseitigen Implementierung POST wird, die höchstwahrscheinlich in C # sein wird (könnte VB.NET sein)
sh1rts
1
Während es normalerweise funktioniert, wird das manuelle Einfügen __doPostBacknicht unterstützt. Wenn Ihre Seite nichts enthält, was ein Postback auslöst, kann es sein, dass asp.net die Definition der __doPostBackFunktion unterlässt . Der unterstützte Ansatz ist der Aufruf ClientScriptManager.GetPostBackEventReference, der eine Zeichenfolge im Formular zurückgibt __doPostBack(...)und sicherstellt, dass diese __doPostBackdefiniert ist.
Brian

Antworten:

156

Sie können dies in Ihrem Webformular mit einer Schaltfläche namens btnSave versuchen, zum Beispiel:

<input type="button" id="btnSave" onclick="javascript:SaveWithParameter('Hello Michael')" value="click me"/>

<script type="text/javascript">
function SaveWithParameter(parameter)
{
  __doPostBack('btnSave', parameter)
}
</script>

Und fügen Sie in Ihrem Code dahinter so etwas hinzu, um den Wert zu lesen und ihn zu bearbeiten:

public void Page_Load(object sender, EventArgs e)
{
  string parameter = Request["__EVENTARGUMENT"]; // parameter
  // Request["__EVENTTARGET"]; // btnSave
}

Probieren Sie es aus und lassen Sie uns wissen, ob das für Sie funktioniert hat.

Herr Herr
quelle
1
Nur eine kurze Frage: __EVENTARGUMENT wäre der Parameter oder btnSave?
Harsimranb
3
Es ist der Parameter. __EVENTTARGET gibt Ihnen die Schaltfläche.
Herr Herr
Was ist, wenn ich zwei oder mehr Schaltflächen habe, die __doPostBack ausführen? Wie kann ich sie dann auf der Serverseite in page_load () unterscheiden?
Khalid Khan
1
Was ist der Fall, wenn ich mehr als einen Parameter habe?
Wilson
1
@ Wilson als ein anderer Gedanke, Ihr Argument könnten Json-Daten sein, die einem Objekt in Ihrem C # zugeordnet werden könnten. Sie könnten dann Json.net verwenden, um Objekte zu deserialisieren / zu serialisieren usw.
Mr. Mr.
25

Dies ist auch eine gute Möglichkeit, serverseitige Steuerelemente in FancyBox und / oder jQuery Dialog zum Postback zu bringen . Zum Beispiel in FancyBox-div:

   <asp:Button OnClientClick="testMe('param1');" ClientIDMode="Static"  ID="MyButton"  runat="server" Text="Ok" >
</asp:Button>

JavaScript:

function testMe(params) {
    var btnID= '<%=MyButton.ClientID %>';          
    __doPostBack(btnID, params);
}

Serverseitiges Page_Load:

 string parameter = Request["__EVENTARGUMENT"];
 if (parameter == "param1")
     MyButton_Click(sender, e);
user2775317
quelle
4
sollte UniqueID verwenden, nicht ClientID.
Garr Godfrey
Oder setzen Sie das ClientIDMode="Static"Attribut von MyButton, damit ASP die ID der Schaltfläche nicht entstellt.
David R Tribble
14

Hier ist ein kurzes Tutorial, wie es __doPostBack()funktioniert.

Um ehrlich zu sein, benutze ich es nicht viel; zumindest direkt. Viele Server - Steuerelemente, ( zum Beispiel Button, LinkButton, ImageButton, Teile der GridViewetc.) Verwendung __doPostBackals Postback - Mechanismus.

kbrimington
quelle
Schneller Vorlauf 6 Jahre später; Ich werde schockiert sein, wenn ich das noch benutze. Der Ansatz zur Webentwicklung hat sich im Allgemeinen von der Mentalität entfernt, in der solche Dinge verwendet werden.
Phil
@Phil - haha, ich habe diesen Thread gestern gelesen, als ich mir einen Fehler angesehen habe, bei dem dies implementiert wurde :) Es scheint heutzutage ziemlich archaisch
Terry Delahunt
12
Schneller Vorlauf 6 Jahre ... und ASP.NET Web Forms tut dies immer noch. Daher die überwältigende Zustimmung zur akzeptierten Antwort.
Kbrimington
@kbrimington: Ich habe nicht gesagt, dass ASP.NET dies nicht "immer noch tun" wird. Ich erwarte nicht, dass sich daran viel ändert. Was ich damit gemeint habe ist, dass weniger Leute ASP.NET WebForm für neue Entwicklungen verwenden und andere davon migrieren.
Phil
10

Ich möchte diesem Beitrag nur etwas hinzufügen für asp:button. Ich habe clientId ausprobiert und es scheint bei mir nicht zu funktionieren:

__doPostBack('<%= btn.ClientID%>', '');

Das Abrufen der UniqueId scheint jedoch wie folgt auf den Server zurückzusenden:

__doPostBack('<%= btn.UniqueID%>', '');

Dies könnte in Zukunft jemand anderem helfen und dies daher veröffentlichen.

Polynom Proton
quelle
1
Ja, ich hatte Probleme damit ClientID, weil ich es benutzt habe ClientIDMode = Static. Mit UniqueIDgearbeitet.
Phiter
Ich habe versucht, dies zum Laufen zu bringen, und weder ClientID noch UniqueId funktionieren für mich.
Atamata
OH MEIN GOTT! Einige Tage, um dieses Problem zu lösen. UniqueID hat das Problem gelöst. Danke Alter!
Faiz Infy
2

Alte Frage, aber ich möchte noch etwas hinzufügen: Beim Aufruf können doPostBack()Sie die Server-Handler-Methode für die Aktion verwenden.

Zum Beispiel:

__doPostBack('<%= btn.UniqueID%>', 'my args');

Wird auf dem Server ausgelöst:

protected void btn_Click(object sender, EventArgs e)

Ich habe keinen besseren Weg gefunden, um das Argument zu verstehen, also benutze ich es immer noch Request["__EVENTARGUMENT"].

Anderson Pimentel
quelle
0

Wie bereits erwähnt, müssen Sie der __doPostback () -Methode die UniqueID des Steuerelements bereitstellen.

__doPostBack('<%= btn.UniqueID %>', '');

Auf dem Server werden die übermittelten Formularwerte durch den identifizierten Namen Attribut der Felder in der Seite.

Der Grund, warum UniqueID funktioniert, ist, dass UniqueID und Name tatsächlich dasselbe sind, wenn das Serversteuerelement in HTML gerendert wird.

Hier ist ein Artikel, der beschreibt, was die UniqueID ist:

Die UniqueID-Eigenschaft wird auch verwendet, um einen Wert für das HTML-Attribut "name" von Eingabefeldern (Kontrollkästchen, Dropdown-Listen und ausgeblendete Felder) bereitzustellen. UniqueID spielt auch bei Postbacks eine wichtige Rolle. Die UniqueID-Eigenschaft eines Serversteuerelements, das Postbacks unterstützt, stellt Daten für das ausgeblendete Feld __EVENTTARGET bereit. Die ASP.NET-Laufzeit verwendet dann das Feld __EVENTTARGET, um das Steuerelement zu finden, das das Postback ausgelöst hat, und ruft dann die RaisePostBackEvent-Methode auf.

src: https://www.telerik.com/blogs/the-difference-between-id-clientid-and-uniqueid

jBelanger
quelle
0

So mache ich es

    public void B_ODOC_OnClick(Object sender, EventArgs e)
    {
        string script="<script>__doPostBack(\'fileView$ctl01$OTHDOC\',\'{\"EventArgument\":\"OpenModal\",\"EncryptedData\":null}\');</script>";
        Page.ClientScript.RegisterStartupScript(this.GetType(),"JsOtherDocuments",script);               
    }
aliihsan muhziroğlu
quelle