2013-06-14 46 views
5

Đây là vấn đề:Tại sao trình xử lý sự kiện riêng tư không hoạt động trong ASP.NET

Tôi có biểu mẫu ASP.NET đơn giản với 2 nút.

Một trong số đó được tạo ra bằng cách kéo các nút từ các công cụ và chọn mà chúng tôi tạo trực tiếp trong HTML:

<body> 
<form id="Form1" method="post" runat="server"> 
    <asp:Button OnClick="ABC" Runat="server" Text="rrr" id="Button1"></asp:Button> 
    <asp:Button id="Button2" runat="server" Text="Button"></asp:Button> 
</form> 
</body> 

Button2 được tạo bằng công cụ và có tổ chức sự kiện Handler sau:

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click 
     Dim s As String = "" 
End Sub 

"Trình xử lý sự kiện riêng tư này chạy mà không có bất kỳ vấn đề nào.

Tuy nhiên đối với nút được tạo dưới dạng HTML, chúng tôi có trình xử lý sự kiện sau:

Private Sub ABC(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 

     Dim a As Integer = 0 

End Sub 

Đối với một này tôi nhận được lỗi hãy biên dịch sau:

Compiler Error Message: BC30390: 'WebApplication9.WebForm1.Private Sub ABC(sender As Object, e As System.EventArgs)' is not accessible in this context because it is 'Private'. 

Nếu tôi thay đổi phạm vi xử lý sự kiện từ cá nhân để bảo vệ này sẽ làm việc. Câu hỏi là tại sao riêng tư làm việc cho một trình xử lý sự kiện nhưng không phải là một trình xử lý sự kiện khác.

+2

Có 'OnClick' ** và ** Handles' có nghĩa là bạn đang cố gắng kết nối hai lần - một lần từ mã phía sau và một lần từ HTML. Nếu bạn chuyển sang 'Được bảo vệ', bạn sẽ thấy rằng trình xử lý sự kiện được gọi hai lần (vì bạn hiện có nó). Loại bỏ các 'OnClick' trong HTML –

+0

Tôi chỉ cố gắng thêm" Hanldes "sau khi tôi thấy lỗi biên dịch. Tôi nhận được cùng một lỗi biên dịch có hoặc không có từ khóa Trình xử lý. –

+0

Tôi đã xóa 'OnClick' trong HTML, không phải' Handles'. –

Trả lời

8

Về cơ bản, trang aspx được triển khai dưới dạng hai lớp học. Một trong những lớp này chứa mã của bạn đằng sau mã (.aspx.vb) (và, tùy thuộc vào phiên bản/mô hình ASP.Net bạn đang sử dụng, cũng có một số mã do nhà thiết kế tạo ra (.aspx.designer.vb)).

Lớp thứ hai được tạo khi trang được yêu cầu đầu tiên (hoặc trang web được biên dịch trước) và chứa bất kỳ mã nội tuyến nào từ trang .aspx và mã khác do ASP.Net tạo và bao gồm ví dụ: mã cho bất kỳ điều khiển nào được khai báo với runat="server".

Lớp thứ hai này kế thừa từ lần đầu tiên.

Vì vậy, nếu lớp đầu tiên chịu trách nhiệm hooking lên xử lý sự kiện của nó, nó sử dụng một Handles clause *:

Private Sub ABC(...) Handles Button1.Click 

Button1 thuộc về lớp này vì nó được đặt ở đó bởi các nhà thiết kế tạo ra mã. Mọi thứ đều là cục bộ cho lớp này, và do đó phương thức có thể là Private.

Nếu thứ hai lớp chịu trách nhiệm hooking lên một event handler, nó có phải nó bằng cách sử dụng các thuộc tính trên điều khiển máy chủ, chẳng hạn như ở đây:

<asp:Button OnClick="ABC" Runat="server" 

Bây giờ, trừ khi ABC là một phương pháp tuyên bố inline bên trong file .aspx, nó phải là từ hạng nhất (hoặc bất kỳ lớp học mà từ đó các đầu tiên tự thừa hưởng từ)

Bây giờ chúng ta có một situa tion nơi mã trong lớp học thứ hai muốn tham chiếu đến mã trong lớp đầu tiên. Và như vậy, các quy tắc của .NET nói rằng thành viên mà nó đang cố truy cập không thể là Private.


gì bạn không nên có, như bạn có trong câu hỏi của bạn, là cả lớp chịu trách nhiệm về hooking lên (tương tự) xử lý sự kiện.


* Nó không sử dụng một điều khoản Handles - nó cũng có thể thiết lập các xử lý sự kiện sử dụng AddHandler bên trong ví dụ sự kiện Page_Load hoặc bất kỳ nơi nào khác phù hợp. Handles là thành ngữ cho các điều khiển tĩnh trên một trang trong VB. Trong C#, không có tương đương với Handles, do đó trình xử lý sự kiện được kết nối với tương đương với C# AddHandler, +=.

+1

Giải thích tuyệt vời –

+0

Giải thích tốt nhưng không phải mọi thứ được tuyên bố là riêng tư: Button1 chính nó được khai báo là Được bảo vệ: Được bảo vệ WithEvents Button1 As System.Web.UI.WebControls.Button –

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