2013-03-28 45 views
9

Tôi đã sử dụng điều khiển <asp:Button /> và sau khi hiển thị trong trình duyệt kiểm soát không được gán thuộc tính sự kiện click. Làm thế nào chính xác là nó gọi sự kiện bên sever?phương thức __doPostBack được gọi như thế nào? Phương thức gọi điện ở đâu?

đang ASPX:

<asp:Button ID="Button1" runat="server" Text="Button" OnClick="TestClickEvent" /> 

Việc kiểm soát trên được trả lại trong trình duyệt như đoạn mã sau:

<input type="submit" name="Button1" value="Button" id="Button1"> 

Các mã sau đây được trả lại trong trình duyệt, trong đó đặt __EVENTTARGET. Nghi ngờ của tôi là phương thức __doPostBack được gọi là gì? Phương thức gọi điện ở đâu?

function __doPostBack(eventTarget, eventArgument) { 
     if (!theForm.onsubmit || (theForm.onsubmit() != false)) { 
      theForm.__EVENTTARGET.value = eventTarget; 
      theForm.__EVENTARGUMENT.value = eventArgument; 
      theForm.submit(); 
     } 
    } 
+3

Hiển thị mã của chúng tôi, vui lòng –

+0

_ "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. –

+0

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

Trả lời

12

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 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 đượ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ố - eventTargeteventArgument. 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!

+0

wow thực sự thích giải thích này, đã được sử dụng ASP.NET từ 5 năm qua nhưng không cố gắng để biết làm thế nào nó thực sự làm việc trong chi tiết này !!! – Ali

+1

Rất vui được giúp! :-D – Jesse

4

kiểm soát của bạn là một nút gửi, nó có thể trực tiếp gửi biểu mẫu đến máy chủ mà không cần gọi phương thức __doPostBack. Vì vậy, trong trường hợp này __dopostback không được gọi. __dopostback được sử dụng cho các điều khiển không có hành vi gửi mặc định, như danh sách thả xuống.

Việc kết nối với sự kiện phía máy chủ của bạn xảy ra thông qua giao diện ipostbackeventhandler mà bộ điều khiển của bạn thực hiện. Để biết thêm xin vui lòng kiểm tra http://msdn.microsoft.com/en-us/library/system.web.ui.ipostbackeventhandler.raisepostbackevent.aspx

+0

mà không cần gọi phương thức _dopostback, giá trị __EVENTTARGET được khởi tạo như thế nào. –

+0

Nó sẽ không được khởi tạo và bạn không cần nó, bởi vì nút gửi biểu mẫu trực tiếp, không thông qua _dopostback, khung asp.net biết ai đã sa thải sự kiện và nó sẽ gọi phương thức RaisePostBackEvent của ipostbackeventhandler. sự kiện bấm của nút – Atti

3

Vâng, lý do bạn nghi ngờ là vì bạn cho rằng chức năng __doPostBack là cần thiết để đăng. Nhưng nó là cách khác vòng, khi html được thiết kế đầu tiên, chỉ có cách để đăng lại máy chủ là thông qua nút gửi. Chức năng này đã được xây dựng trong trình duyệt chúng tự, như vậy mà khi bao giờ nút gửi được nhấn trình duyệt thông qua các dữ liệu của biểu mẫu đến vị trí tuyên bố. nhưng khi trang web phát triển, mọi người bắt đầu đòi hỏi nhiều hơn. Bây giờ các điều khiển khác cũng cần phải đăng lại máy chủ. Để thực hiện chúng, các hack khác nhau được phát triển, hàm __doPostBack nổi tiếng nhất là một trong số chúng. bất kỳ điều khiển nào khác gửi bây giờ đều có thể đăng lại bằng hàm __doPostBack. Nhưng nút gửi tự làm điều đó. Đó là tất cả.

Các vấn đề liên quan