Cara menggunakan __doPostBack ()


161

Saya mencoba membuat postback asyncrhonous menggunakan ASP.NET __doPostBack(), tapi saya tidak tahu bagaimana melakukannya. Saya ingin menggunakan JavaScript vanilla.

Sesuatu yang sederhana seperti klik tombol dapat menyebabkan __doPostBack()acara menyala. Saya hanya mencoba mempelajari cara kerjanya.



9
Pertama-tama __doPostBack tidak menyebabkan tindakan asinkron kecuali dipicu oleh kontrol di dalam UpdatePanel.
Ladislav Mrnka

Mengapa ini ditandai c # dan javascript . Saya mengerti bagian javascript , tetapi bukan bagian c # .
Solomon Ucko

1
@Solomon Ucko - karena __doPostBack () menyebabkan halaman POST untuk implementasi sisi server, yang kemungkinan besar akan berada di C # (bisa menjadi VB.NET)
sh1rts

1
Meskipun biasanya berfungsi, memasukkan secara manual __doPostBacksebenarnya tidak didukung. Jika halaman Anda tidak memiliki apa-apa di dalamnya yang memicu postback, asp.net mungkin menghilangkan mendefinisikan __doPostBackfungsi. Pendekatan yang didukung adalah untuk memanggil ClientScriptManager.GetPostBackEventReference, yang mengembalikan string dalam bentuk __doPostBack(...)dan memastikan bahwa __doPostBackdidefinisikan.
Brian

Jawaban:


156

Anda dapat mencoba ini di formulir web Anda dengan tombol bernama btnSave misalnya:

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

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

Dan dalam kode Anda di belakang tambahkan sesuatu seperti ini untuk membaca nilai dan mengoperasikannya:

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

Cobalah itu dan beri tahu kami jika itu berhasil untuk Anda.


1
Hanya pertanyaan singkat, __EVENTARGUMENT akan menjadi parameter atau btnSimpan?
harsimranb

3
Itu adalah parameter. __EVENTTARGET akan memberi Anda tombolnya.
Tn. Tn.

bagaimana jika saya memiliki dua tombol atau lebih yang melakukan __doPostBack lalu bagaimana saya membedakannya di sisi server di page_load ().
khalid khan

1
Apa yang terjadi ketika saya memiliki lebih dari satu parameter?
Wilson

1
@ Willson sebagai orang lain berpendapat argumen Anda bisa berupa data Json yang dapat memetakan ke suatu objek di C # Anda, Anda kemudian dapat menggunakan Json.net untuk deserialise / serialisasi ke objek dll.
Mr. Mr.

25

Ini juga merupakan cara yang baik untuk mendapatkan kontrol sisi server untuk diposkan kembali di dalam FancyBox dan / atau jQuery Dialog . Misalnya, di 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 sisi-server:

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

4
harus menggunakan UniqueID, bukan ClientID.
Garr Godfrey

Atau atur ClientIDMode="Static"atribut MyButton, agar ASP tidak memotong ID tombol.
David R Tribble

14

Berikut tutorial singkat tentang cara __doPostBack()kerjanya.

Sejujurnya, saya tidak banyak menggunakannya; setidaknya secara langsung. Banyak server kontrol, (misalnya, Button, LinkButton, ImageButton, bagian dari GridView, dll) digunakan __doPostBacksebagai mekanisme kembali pos mereka.


Maju cepat 6 tahun kemudian; Saya akan kaget jika masih menggunakan ini. Pendekatan terhadap pengembangan web umumnya telah menjauh dari mentalitas di mana hal-hal seperti ini digunakan.
Phil

@Phil - haha, saya membaca utas ini kemarin sambil melihat bug di mana ini diterapkan :) Kelihatannya cukup kuno di zaman sekarang
Terry Delahunt

12
Maju cepat 6 tahun ... dan Formulir Web ASP.NET masih melakukan ini. Karena itu, banyak sekali jawaban yang diterima.
kbrimington

@ kbrimington: Saya tidak mengatakan ASP.NET tidak akan "masih melakukan ini". Saya tidak berharap itu banyak berubah. Yang saya maksudkan adalah bahwa lebih sedikit orang yang menggunakan ASP.NET WebForm untuk pengembangan baru dan yang lainnya bermigrasi darinya.
Phil

10

Saya hanya ingin menambahkan sesuatu ke pos ini asp:button. Saya sudah mencoba clientId dan sepertinya tidak berfungsi untuk saya:

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

Namun, mendapatkan UniqueId tampaknya mengirim kembali ke server, seperti di bawah ini:

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

Ini mungkin membantu orang lain di masa depan, karenanya memposting ini.


1
Ya saya mengalami masalah dengan ClientID, karena saya menggunakan ClientIDMode = Static. Menggunakan UniqueIDbekerja.
Phiter

Saya sudah mencoba menjalankannya dan ClientID maupun UniqueId tidak berfungsi untuk saya.
atamata

OH TUHAN! Beberapa hari mencoba menyelesaikan masalah ini. UniqueID memang memecahkan masalah. Terima kasih Bung!
Faiz Infy

2

Pertanyaan lama, tapi saya ingin menambahkan sesuatu: saat menelepon doPostBack() Anda dapat menggunakan metode penangan server untuk tindakan.

Sebagai contoh:

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

Akan menyala, di server:

protected void btn_Click(object sender, EventArgs e)

Saya tidak menemukan cara yang lebih baik untuk mendapatkan argumen, jadi saya masih menggunakan Request["__EVENTARGUMENT"] .


0

Seperti yang dikatakan orang lain, Anda perlu memberikan UniqueID dari kontrol ke metode __doPostback ().

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

Di server, nilai formulir yang dikirimkan diidentifikasi oleh atribut nama bidang di halaman.

Alasan mengapa UniqueID bekerja adalah karena UniqueID dan nama sebenarnya adalah hal yang sama ketika kontrol server diberikan dalam HTML.

Inilah artikel yang menjelaskan apa itu UniqueID:

Properti UniqueID juga digunakan untuk memberikan nilai untuk atribut "nama" HTML bidang input (kotak centang, daftar dropdown, dan bidang tersembunyi). UniqueID juga memainkan peran utama dalam postback. Properti UniqueID dari kontrol server, yang mendukung postback, menyediakan data untuk bidang tersembunyi __EVENTTARGET. ASP.NET Runtime kemudian menggunakan bidang __EVENTTARGET untuk menemukan kontrol yang memicu postback dan kemudian memanggil metode RaisePostBackEvent.

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


0

Beginilah cara saya melakukannya

    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);               
    }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.