วิธีใช้ __doPostBack ()


161

ฉันพยายามสร้าง postback แบบ asyncrhonous ใน ASP.NET โดยใช้__doPostBack()แต่ฉันไม่รู้ว่าจะทำอย่างไร ฉันต้องการใช้ JavaScript วานิลลา

สิ่งที่ง่ายเหมือนการคลิกปุ่มอาจทำให้__doPostBack()เหตุการณ์เริ่มทำงาน ฉันแค่พยายามที่จะเรียนรู้วิธีการทำงานของกลไก


ข้อความที่เป็นไปได้ซ้ำซ้อนของAsychnronous Send Asp.net
Kris van der Mast

9
ก่อนอื่น __doPostBack จะไม่ทำให้เกิดการกระทำแบบอะซิงโครนัสเว้นแต่จะมีการเรียกใช้โดยการควบคุมภายใน UpdatePanel
Ladislav Mrnka

เหตุใดจึงติดแท็กc #และjavascriptนี้ ฉันเข้าใจจาวาสคริปต์ส่วนหนึ่ง แต่ไม่C #ส่วนหนึ่ง
โซโลมอน Ucko

1
@Solomon Ucko - เพราะ __doPostBack () ทำให้หน้า POST กับการติดตั้งฝั่งเซิร์ฟเวอร์ซึ่งน่าจะเป็น C # (อาจเป็น VB.NET)
sh1rts

1
ในขณะที่ใช้งานได้ปกติการแทรกด้วยตนเอง__doPostBackไม่ได้รับการสนับสนุนจริง หากหน้าเว็บของคุณไม่มีสิ่งใดที่จะทำให้เกิด postback asp.net อาจละเว้นการกำหนด__doPostBackฟังก์ชัน วิธีการที่ได้รับการสนับสนุนคือการโทรClientScriptManager.GetPostBackEventReferenceซึ่งจะส่งกลับสตริงในรูปแบบ__doPostBack(...)และตรวจสอบให้แน่ใจว่า__doPostBackมีการกำหนด
Brian

คำตอบ:


156

คุณสามารถลองในรูปแบบเว็บของคุณด้วยปุ่มที่เรียกว่า btnSave ตัวอย่างเช่น:

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

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

และในโค้ดของคุณที่อยู่ด้านหลังให้เพิ่มสิ่งนี้เพื่ออ่านค่าและใช้งานมัน:

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

ลองทำดูและบอกให้เรารู้ว่ามันเหมาะกับคุณหรือไม่


1
เพียงแค่คำถามด่วน __EVENTARGUMENT จะเป็นพารามิเตอร์หรือ btnSave หรือไม่
harsimranb

3
มันเป็นพารามิเตอร์ __EVENTTARGET จะให้ปุ่มแก่คุณ
นายมิสเตอร์

จะทำอย่างไรถ้าฉันมีปุ่มสองปุ่มขึ้นไปที่ทำ __doPostBack ดังนั้นฉันจะแยกความแตกต่างเหล่านั้นทางฝั่งเซิร์ฟเวอร์ใน page_load () ได้อย่างไร
khalid khan

1
จะเกิดอะไรขึ้นเมื่อฉันมีพารามิเตอร์มากกว่าหนึ่งตัว
วิลสัน

1
@Wilson คิดว่าข้อโต้แย้งของคุณอาจเป็นข้อมูล Json ซึ่งสามารถแมปกับวัตถุใน C # ของคุณได้จากนั้นคุณสามารถใช้ Json.net เพื่อ deserialise / ซีเรียลไลซ์สำหรับวัตถุอื่น ๆ
Mr.

25

นอกจากนี้ยังเป็นวิธีที่ดีที่จะได้รับการควบคุมฝั่งเซิร์ฟเวอร์เพื่อรายงานผลภายในFancyBox และ / หรือ jQuery โต้ตอบ ตัวอย่างเช่นใน 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 ฝั่งเซิร์ฟเวอร์:

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

4
ควรใช้ UniqueID ไม่ใช่ ClientID
Garr Godfrey

หรือตั้งค่าClientIDMode="Static"คุณสมบัติของMyButtonเพื่อไม่ให้ ASP ยุ่งเหยิง ID ของปุ่ม
David R Tribble

14

นี่คือบทแนะนำสั้น ๆ เกี่ยวกับวิธีการ__doPostBack()ทำงาน

พูดตามตรงฉันไม่ได้ใช้มากนัก อย่างน้อยโดยตรง การควบคุมหลายเซิร์ฟเวอร์ (เช่นButton, LinkButton, ImageButtonชิ้นส่วนของGridViewอื่น ๆ ) ใช้__doPostBackเป็นกลไกในการโพสต์ของพวกเขากลับ


กรอไปข้างหน้า 6 ปีต่อมา; ฉันจะตกใจถ้ายังใช้มันอยู่ วิธีการในการพัฒนาเว็บโดยทั่วไปได้เปลี่ยนไปจากความคิดที่ใช้สิ่งนี้
Phil

@Phil - ฮ่าฮ่าฉันได้อ่านหัวข้อนี้เมื่อวานนี้ในขณะที่ดูข้อผิดพลาดที่ถูกนำมาใช้ :) ดูเหมือนจะค่อนข้างเก่าแก่ในสมัยนี้
Terry Delahunt

12
กรอไปข้างหน้าอย่างรวดเร็ว 6 ปี ... และเว็บฟอร์ม ASP.NET ยังคงทำเช่นนี้ ดังนั้นการ upvoting อย่างท่วมท้นของคำตอบที่ยอมรับ
kbrimington

@ kbrimington: ฉันไม่ได้บอกว่า ASP.NET จะไม่ "ยังทำเช่นนี้" ฉันไม่คิดว่ามันจะเปลี่ยนแปลงมากนัก สิ่งที่ฉันหมายถึงคือมีผู้ใช้ ASP.NET WebForm น้อยลงสำหรับการพัฒนาใหม่และคนอื่น ๆ กำลังโยกย้ายออกไป
Phil

10

asp:buttonฉันต้องการเพียงเพื่อเพิ่มสิ่งที่จะโพสต์นี้ ฉันได้ลองใช้รหัสลูกค้าและดูเหมือนจะไม่เหมาะกับฉัน:

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

อย่างไรก็ตามการรับ UniqueId ดูเหมือนจะโพสต์กลับไปที่เซิร์ฟเวอร์เช่นด้านล่าง:

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

สิ่งนี้อาจช่วยคนอื่นในอนาคตดังนั้นการโพสต์สิ่งนี้


1
ใช่ผมมีปัญหาเกี่ยวกับการเพราะผมใช้ClientID ClientIDMode = Staticใช้UniqueIDงานได้
Phiter

ฉันพยายามทำให้มันใช้งานได้และไม่ได้ใช้ ClientID หรือ UniqueId สำหรับฉัน
atamata

พระเจ้าช่วย! ไม่กี่วันที่พยายามแก้ไขปัญหานี้ UniqueID แก้ปัญหาได้ ขอบคุณนะเพื่อน!
Faiz Infy

2

คำถามเก่า แต่ฉันต้องการเพิ่มบางอย่าง: เมื่อโทรdoPostBack()คุณสามารถใช้วิธีการจัดการเซิร์ฟเวอร์สำหรับการดำเนินการ

ตัวอย่างเช่น

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

จะเริ่มทำงานบนเซิร์ฟเวอร์:

protected void btn_Click(object sender, EventArgs e)

Request["__EVENTARGUMENT"]ฉันไม่พบวิธีที่ดีกว่าที่จะได้รับการโต้แย้งดังนั้นฉันยังคงใช้


0

เหมือนที่คนอื่นพูดคุณต้องให้ UniqueID ของการควบคุมกับวิธี __doPostback ()

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

บนเซิร์ฟเวอร์ค่าฟอร์มที่ส่งจะถูกระบุโดยแอตทริบิวต์nameของฟิลด์ในหน้า

สาเหตุที่ทำให้UniqueIDทำงานได้เนื่องจากUniqueIDและชื่อนั้นเหมือนกันเมื่อการควบคุมเซิร์ฟเวอร์แสดงผลในรูปแบบ HTML

นี่คือบทความที่อธิบายถึง UniqueID:

คุณสมบัติ UniqueID ยังใช้เพื่อระบุค่าสำหรับแอตทริบิวต์ "ชื่อ" HTML ของฟิลด์ป้อนข้อมูล (ช่องทำเครื่องหมายรายการดรอปดาวน์และฟิลด์ที่ซ่อนอยู่) UniqueID ยังมีบทบาทสำคัญใน postbacks คุณสมบัติ UniqueID ของการควบคุมเซิร์ฟเวอร์ซึ่งรองรับการโพสต์กลับให้ข้อมูลสำหรับฟิลด์ที่ซ่อนอยู่ __EVENTTARGET จากนั้นรันไทม์ของ ASP.NET จะใช้ฟิลด์ __EVENTTARGET เพื่อค้นหาตัวควบคุมที่ทริกเกอร์การโพสต์แบ็กจากนั้นเรียกเมธอด RaisePostBackEvent

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


0

นี่คือวิธีที่ฉันทำ

    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);               
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.