Câu trả lời đơn giản này: Các __doPostBack
hàm JavaScript được gọi dựa trên đặc <asp />
điều khiển và những sự kiện mà nó xử lý.
Câu trả lời chi tiết: Điều đó tùy thuộc.
Trước tiên, hãy xem ví dụ của bạn. Bạn có một số <asp:Button />
được hiển thị dưới dạng tiêu chuẩn <input type="submit" />
. Mọi thứ trong ASP.NET WebForms xoay quanh thẻ tiêu chuẩn HTML <form>
. HTML <form>
được gửi mà không cần việc sử dụng hoặc hỗ trợ JavaScript bằng cách nhấp vào nút <input type="submit" />
. Với điều này trong tâm trí, bạn có thể thấy rõ (mà bạn đã nhận thấy) rằng nút <input type="submit" />
được hiển thị là không có sự kiện onclick
được chỉ định. Và, như bạn có thể thấy, biểu mẫu được gửi khi nút được nhấp.
Khi nói đến cách mã kết thúc (C#/VB.NET/etc.) Được thực hiện khi nút <input type="submit" />
được nhấp vào: tất cả được xử lý bởi ASP.NET Framework, và nằm ngoài phạm vi câu hỏi/câu trả lời này.
Thứ hai, bây giờ hãy che __doPostBack
là gì, và làm thế nào nó được sử dụng.__doPostBack
đơn giản chỉ là một hàm JavaScript trợ giúp được sử dụng để gửi HTML <form>
. Do các lý do được nêu ở trên, giờ đây bạn biết lý do tại sao nút <input type="submit" />
không không cần gọi hàm __doPostBack
.
Để đơn giản, chúng ta hãy nhìn vào một trang ASP.NET trong đó có một kiểm soát <asp:DropDownList />
, và nó có xử lý sự kiện SelectedIndexChanged
giao:
<asp:DropDownList ID="MyDropDownList" AutoPostBack="true" OnSelectedIndexChanged="MyDropDownList_SelectedIndexChanged" runat="server" />
Các <asp:DropDownList />
được trả lại như sau:
<select id="ctl00_MyDropDownList" onchange="javascript:setTimeout('__doPostBack(\'ctl00$MyDropDownList\',\'\')', 0)" name="ctl00$MyDropDownList"></select>
hãy bỏ qua hàm setTimeout
trong sự kiện onchange
- nó chỉ là cách giải quyết hacky được ASP.NET sử dụng - và hãy tập trung o n các chức năng __doPostBack
bên trong của nó.
Như bạn có thể thấy ở đây, các __doPostBack
chức năng là được gọi bởi các handler onchange
sự kiện. Điểm khác biệt chính là việc thay đổi giá trị của điều khiển <asp:DropDownList />
hoặc <select />
không khiến trình duyệt gửi biểu mẫu!
Một lần nữa ASP.NET Framework xử lý nội bộ cách mã kết thúc được thực hiện khi biểu mẫu được gửi (cho dù thông qua hàm __doPostBack
hay không).
Cuối cùng, như đối với các chi tiết của __doPostBack
: nó chấp nhận hai tham số - eventTarget
và eventArgument
. eventTarget
chứa thuộc tính HTML trả về id
của điều khiển gây ra postback; và eventArgument
là thông số tùy chọn có thể được sử dụng để chuyển dữ liệu bổ sung vào mã kết thúc.
Chỉnh sửa Thông tin bổ sung: OP hỏi một câu hỏi rất thú vị - những gì xảy ra khi có nhiều hơn một nút gửi?
Vâng, trong một hoạt động POST
, trình duyệt bao gồm value
của <input type="submit" />
khiến hoạt động để bắt đầu.
Điều này có nghĩa là, giống như bạn có được giá trị của các phần tử <input />
, bạn cũng có thể truy vấn nút nào gây ra việc gửi!
Hiển thị mã của chúng tôi, vui lòng –
_ "sau khi hiển thị trong trình duyệt" _ Tôi nghĩ bạn đang nhầm lẫn giữa mã máy chủ và mã khách hàng. –
Tôi nghĩ bạn nên đọc http://support.microsoft.com/kb/306459 nó giải thích các điều khiển trên máy chủ Web Forms. Trong postbacks bản chất được thực hiện thông qua javascript, các trường ẩn __EVENTTARGET và __VIEWSTATE giữ thông tin về những gì đã được nhấp và dữ liệu trên trang tương ứng.Việc xử lý các cảnh __EVENTTARGET vv được thẩm vấn và trình xử lý sự kiện phía máy chủ thích hợp được gọi. – bUKaneer