Come usare __doPostBack ()


161

Sto cercando di creare un postback asincrono in ASP.NET utilizzando __doPostBack(), ma non ho idea di come farlo. Voglio usare JavaScript vaniglia.

Qualcosa di semplice come un clic sul pulsante può far scattare l' __doPostBack()evento. Sto solo cercando di imparare come funziona il meccanismo.



9
Innanzitutto __doPostBack non provoca azioni asincrone a meno che non sia attivato dal controllo all'interno di UpdatePanel.
Ladislav Mrnka,

Perché questo è taggato c # e javascript . Capisco la parte javascript , ma non la parte c # .
Solomon Ucko l'

1
@Solomon Ucko - perché __doPostBack () fa sì che la pagina venga POST alla sua implementazione sul lato server, che molto probabilmente sarà in C # (potrebbe essere VB.NET)
sh1rts

1
Mentre di solito funziona, l'inserimento manuale __doPostBacknon è effettivamente supportato. Se la tua pagina non contiene nulla che attivi un postback, asp.net potrebbe omettere di definire la __doPostBackfunzione. L'approccio supportato è call ClientScriptManager.GetPostBackEventReference, che restituisce una stringa nel modulo __doPostBack(...)e garantisce che __doPostBacksia definito.
Brian

Risposte:


156

Puoi provarlo nel tuo modulo web con un pulsante chiamato btnSave ad esempio:

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

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

E nel tuo codice dietro aggiungi qualcosa di simile per leggere il valore e operare su di esso:

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

Provalo e facci sapere se ha funzionato per te.


1
Solo una domanda veloce, __EVENTARGUMENT sarebbe il parametro o btnSave?
harsimranb,

3
È il parametro __EVENTTARGET ti darà il pulsante.
Mr. Mr.

cosa succede se ho due o più pulsanti che eseguono __doPostBack, allora come posso differenziarli sul lato server in page_load ().
khalid khan,

1
Qual è il caso in cui ho più di un parametro?
Wilson,

1
@Wilson come altro pensava che la tua argomentazione potesse essere dati Json che potevano essere mappati su un oggetto nel tuo C #, quindi potresti usare Json.net per deserializzare / serializzare per obiettare ecc.
Mr. Mr.

25

Questo è anche un buon modo per ottenere i controlli sul lato server da postback all'interno di FancyBox e / o jQuery Dialog . Ad esempio, 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);
}

Page_Load lato server:

 string parameter = Request["__EVENTARGUMENT"];
 if (parameter == "param1")
     MyButton_Click(sender, e);

4
dovrebbe usare UniqueID, non ClientID.
Garr Godfrey,

Oppure imposta l' ClientIDMode="Static"attributo di MyButton, in modo che ASP non manipoli l'ID del pulsante.
David R Tribble,

14

Ecco un breve tutorial su come __doPostBack()funziona.

Ad essere sincero, non lo uso molto; almeno direttamente. Molti controlli server, (ad esempio, Button, LinkButton, ImageButton, parti del GridView, etc.) l'uso __doPostBackcome meccanismo di nuovo posta.


Avanzamento veloce 6 anni dopo; Sarò scioccato se lo uso ancora. L'approccio allo sviluppo web si è generalmente allontanato dalla mentalità in cui vengono utilizzate cose come questa.
Phil

@Phil - haha, stavo leggendo questo thread ieri mentre guardavo un bug in cui era stato implementato :) Sembra abbastanza arcaico in questi tempi
Terry Delahunt,

12
Avanzamento rapido di 6 anni ... e ASP.NET Web Forms lo fa ancora. Da qui la schiacciante votazione della risposta accettata.
Kbrimington,

@kbrimington: non ho detto che ASP.NET non "continuerà a farlo". Non mi aspetto che cambi molto. Quello che intendevo dire è che meno persone usano ASP.NET WebForm per nuovi sviluppi e altri stanno migrando da esso.
Phil

10

Vorrei solo aggiungere qualcosa a questo post per asp:button. Ho provato clientId e non sembra funzionare per me:

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

Tuttavia, ottenere UniqueId sembra postare nuovamente sul server, come di seguito:

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

Questo potrebbe aiutare qualcun altro in futuro, quindi pubblicando questo.


1
Sì, ho avuto problemi con ClientID, perché stavo usando ClientIDMode = Static. Usando ha UniqueIDfunzionato.
Phiter,

Ho cercato di farlo funzionare e né ClientID né UniqueId funzionano per me.
Atamata,

OH MIO DIO! Pochi giorni cercando di risolvere questo problema. UniqueID ha risolto il problema. Grazie amico!
Faiz Infy,

2

Vecchia domanda, ma vorrei aggiungere qualcosa: quando si chiama doPostBack()è possibile utilizzare il metodo del gestore del server per l'azione.

Per un esempio:

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

Verrà attivato, sul server:

protected void btn_Click(object sender, EventArgs e)

Non ho trovato un modo migliore per ottenere l'argomento, quindi sto ancora usando Request["__EVENTARGUMENT"].


0

Come altri hanno già detto, è necessario fornire l'ID univoco del controllo al metodo __doPostback ().

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

Sul server, i valori del modulo inviato sono identificati dall'attributo name dei campi nella pagina.

Il motivo per cui UniqueID funziona è perché UniqueID e nome sono in realtà la stessa cosa quando il controllo del server è reso in HTML.

Ecco un articolo che descrive cos'è UniqueID:

La proprietà UniqueID viene anche utilizzata per fornire valore per l'attributo HTML "name" dei campi di input (caselle di controllo, elenchi a discesa e campi nascosti). UniqueID svolge anche un ruolo importante nei postback. La proprietà UniqueID di un controllo server, che supporta i postback, fornisce i dati per il campo nascosto __EVENTTARGET. ASP.NET Runtime utilizza quindi il campo __EVENTTARGET per trovare il controllo che ha attivato il postback e quindi chiama il suo metodo RaisePostBackEvent.

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


0

Questo è come lo faccio

    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);               
    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.