Cách sử dụng __doPostBack ()


161

Tôi đang cố gắng tạo một postback không đồng bộ trong ASP.NET bằng cách sử dụng __doPostBack(), nhưng tôi không biết làm thế nào để làm điều đó. Tôi muốn sử dụng JavaScript vanilla.

Một cái gì đó đơn giản như một nút bấm có thể gây ra __doPostBack()sự kiện. Tôi chỉ đang cố gắng học cách cơ chế hoạt động.



9
Trước hết __doPostBack không gây ra hành động không đồng bộ trừ khi được kích hoạt bởi điều khiển bên trong UpdatePanel.
Ladislav Mrnka

Tại sao điều này được gắn thẻ c #javascript . Tôi hiểu phần javascript , nhưng không phải phần c # .
Solomon Ucko

1
@Solomon Ucko - vì __doPostBack () khiến trang POST phải thực hiện phía máy chủ của nó, rất có thể sẽ ở C # (có thể là VB.NET)
sh1rts

1
Mặc dù nó thường hoạt động, chèn thủ công __doPostBackkhông thực sự được hỗ trợ. Nếu trang của bạn không có gì trên đó kích hoạt postback, asp.net có thể bỏ qua việc xác định __doPostBackchức năng. Cách tiếp cận được hỗ trợ là gọi ClientScriptManager.GetPostBackEventReference, trả về một chuỗi trong biểu mẫu __doPostBack(...)và đảm bảo __doPostBackđược xác định.
Brian

Câu trả lời:


156

Bạn có thể thử điều này trong mẫu web của mình bằng một nút gọi là btnSave chẳng hạn:

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

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

Và trong mã của bạn phía sau thêm một cái gì đó như thế này để đọc giá trị và vận hành theo nó:

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

Hãy thử và cho chúng tôi biết nếu điều đó làm việc cho bạn.


1
Chỉ cần một câu hỏi nhanh, __EVENTARGUMENT sẽ là tham số hay btnSave?
harsimranb

3
Đây là tham số. __EVENTTARGET sẽ cung cấp cho bạn nút.
Ông Mr.

nếu tôi có hai hoặc nhiều nút làm __doPostBack thì làm cách nào để phân biệt chúng ở phía máy chủ trong page_load ().
khalid khan

1
Trường hợp khi tôi có nhiều hơn một tham số là gì?
Wilson

1
@Wilson như một người khác nghĩ rằng đối số của bạn có thể là dữ liệu Json có thể ánh xạ tới một đối tượng trong C # của bạn, sau đó bạn có thể sử dụng Json.net để deserialise / serialise cho đối tượng, v.v.
Ông

25

Đây cũng là một cách tốt để có được các điều khiển phía máy chủ để gửi lại trong FancyBox và / hoặc Hộp thoại jQuery . Ví dụ: trong 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);
}

Phía máy chủ Page_Load:

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

4
nên sử dụng UniqueID, không phải ClientID.
Garr Godfrey

Hoặc đặt ClientIDMode="Static"thuộc tính của MyButton, để ASP không thu thập ID của nút.
David R Tribble

14

Đây là một hướng dẫn ngắn gọn về cách làm __doPostBack()việc.

Thành thật mà nói, tôi không sử dụng nó nhiều; ít nhất là trực tiếp Nhiều người điều khiển máy chủ, (ví dụ Button, LinkButton, ImageButton, các bộ phận của GridView, vv) sử dụng __doPostBacknhư cơ chế lại bài viết của họ.


Chuyển tiếp nhanh 6 năm sau; Tôi sẽ bị sốc nếu vẫn sử dụng nó. Cách tiếp cận đối với phát triển web nói chung đã tránh xa tâm lý nơi những thứ như thế này được sử dụng.
Phil

@Phil - haha, tôi đã đọc chủ đề này ngày hôm qua trong khi xem xét một lỗi mà việc này được thực hiện :) Nó có vẻ khá cổ xưa trong thời đại ngày nay
Terry Delahunt

12
Chuyển tiếp nhanh 6 năm ... và ASP.NET Web Forms vẫn làm điều này. Do đó nâng cao áp đảo của câu trả lời được chấp nhận.
kbrimington

@kbrimington: Tôi không nói ASP.NET sẽ không "vẫn làm điều này". Tôi không hy vọng nó sẽ thay đổi nhiều. Ý tôi là ít người sử dụng ASP.NET WebForm cho sự phát triển mới và những người khác đang di chuyển khỏi nó.
Phil

10

Tôi chỉ muốn thêm một cái gì đó vào bài viết này asp:button. Tôi đã thử clientId và nó dường như không hoạt động với tôi:

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

Tuy nhiên, việc nhận UniqueId dường như đăng lại máy chủ, như bên dưới:

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

Điều này có thể giúp đỡ người khác trong tương lai, do đó đăng bài này.


1
Vâng, tôi đã gặp rắc rối với ClientID, bởi vì tôi đang sử dụng ClientIDMode = Static. Sử dụng UniqueIDlàm việc.
Phiter

Tôi đã cố gắng để nó hoạt động và cả ClientID và UniqueId đều không hoạt động với tôi.
atamata

CHÚA ƠI! Vài ngày cố gắng giải quyết vấn đề này. UniqueID đã giải quyết vấn đề. Cảm ơn anh bạn!
Faiz Infy

2

Câu hỏi cũ, nhưng tôi muốn thêm một cái gì đó: khi gọi doPostBack()bạn có thể sử dụng phương thức xử lý máy chủ cho hành động.

Ví dụ:

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

Sẽ kích hoạt, trên máy chủ:

protected void btn_Click(object sender, EventArgs e)

Tôi không tìm thấy cách nào tốt hơn để tranh luận, vì vậy tôi vẫn đang sử dụng Request["__EVENTARGUMENT"].


0

Giống như những người khác đã nói, bạn cần cung cấp UniqueID của điều khiển cho phương thức __doPostback ().

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

Trên máy chủ, các giá trị biểu mẫu đã gửi được xác định bởi thuộc tính tên của các trường trong trang.

Lý do tại sao UniqueID hoạt động là vì UniqueIDtên trên thực tế giống nhau khi điều khiển máy chủ được hiển thị trong HTML.

Đây là một bài viết mô tả UniqueID là gì:

Thuộc tính UniqueID cũng được sử dụng để cung cấp giá trị cho thuộc tính "tên" HTML của các trường đầu vào (hộp kiểm, danh sách thả xuống và các trường ẩn). UniqueID cũng đóng vai trò chính trong postback. Thuộc tính UniqueID của điều khiển máy chủ, hỗ trợ postback, cung cấp dữ liệu cho trường ẩn __EVENTTARGET. ASP.NET Runtime sau đó sử dụng trường __EVENTTARGET để tìm điều khiển kích hoạt postback và sau đó gọi phương thức RaisePostBackEvent của nó.

src: https://www.telerik.com/bloss/the-difference-b between-id-clidid-and-uniqueid


0

Đây là cách tôi làm

    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);               
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.