2013-06-14 11 views
5

Tutaj jest problem:Dlaczego prywatny program obsługi zdarzeń nie działa w środowisku ASP.NET

Mam prosty formularz ASP.NET z 2 przyciskami.

Jednym z nich jest tworzony przez przeciąganie przycisk z narzędziami i drugi stworzyłem bezpośrednio w 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 jest tworzony przy użyciu narzędzi i ma następujące zdarzenie Handler:

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

Ten "prywatny program obsługi zdarzeń działa bezproblemowo:

Jednak dla przycisku, który jest tworzony w HTML, mamy następującą procedurę obsługi zdarzenia:

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

     Dim a As Integer = 0 

End Sub 

Na ten pojawia się następujący błąd complile:

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'. 

Gdybym zmiany zakresu obsługi zdarzeń z Private aby chronić to będzie działać. Pytanie brzmi, dlaczego prywatne prace dla jednej obsługi zdarzeń, ale nie dla drugiej.

+2

Posiadanie 'OnClick' ** i **' Uchwyty' oznacza, że ​​próbujesz podłączyć dwa razy - raz z kodu z tyłu i raz z HTML. Jeśli przełączysz się na "Protected", okaże się, że procedura obsługi zdarzeń jest wywoływana dwukrotnie (tak jak obecnie ją masz). Usuń "OnClick" w HTML –

+0

Po prostu próbowałem dodać "Hanldes" po tym, jak zobaczyłem błąd kompilacji. Dostaję ten sam błąd kompilacji ze słowem kluczowym Handler lub bez niego. –

+0

Powiedziałem, że należy usunąć 'OnClick' w kodzie HTML, a nie' Uchwyty'. –

Odpowiedz

8

Zasadniczo strona aspx jest zaimplementowana jako dwie klasy. Jedna z tych klas zawiera twój kod za kodem (.aspx.vb) (i, w zależności od wersji/modelu ASP.Net, którego używasz, także niektóre generowane przez projektanta kody (.aspx.designer.vb)).

Druga klasa jest tworzona, gdy pierwsza strona jest żądana (lub strona jest wstępnie skompilowana) i zawiera dowolny kod śródliniowy ze strony .aspx i inny kod wygenerowany przez ASP.Net i obejmuje np. kod dla dowolnych kontroli zadeklarowanych przy użyciu runat="server".

Ta druga klasa dziedziczy od pierwszego.

Więc jeśli klasa pierwszy bierze odpowiedzialność za podpinania się do jego obsługi zdarzeń, to używa Handles clause *:

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

Button1 należy do tej grupy, ponieważ był tam umieszczone przez projektanta wygenerowany kod. Wszystko jest lokalne dla tej klasy, więc metoda może być Private.

Jeśli sekund klasa bierze odpowiedzialność za podpinania obsługi zdarzeń, robi to za pomocą atrybutów kontroli serwera, takie jak tutaj:

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

Teraz chyba ABC to metoda zadeklarowana inline wewnątrz plik .aspx, to musi być z pierwszej klasie (lub dowolnej klasy, z której najpierw sama dziedziczy)

Mamy teraz sytuacjami gdzie kod w drugiej klasie chce odnosić się do kodu w klasie najpierw. I tak zasady .NET mówią, że członek, do którego próbuje uzyskać dostęp, nie może być Private.


Czego nie powinien mieć, jak masz w swoim pytaniu, jest oba Klasy biorące odpowiedzialność za podpinania się do (samo) obsługi zdarzeń.


* To nie mieć użyć Handles klauzulę - może to również ustawić obsługi zdarzeń przy użyciu AddHandler wewnątrz np zdarzenie Page_Load lub gdziekolwiek indziej, które jest odpowiednie. Handles jest idiomatyczny dla statycznych elementów sterujących na stronie w VB. W języku C# nie ma odpowiednika Handles, więc programy obsługi zdarzeń są podłączane z C# 's odpowiednikiem AddHandler, +=.

+1

wielkie wyjaśnienie –

+0

Dobre wyjaśnienie, ale nie wszystko, co zostało zadeklarowane, jest zastrzeżone: Sam Button1 jest zadeklarowany jako chroniony: Chroniony przy pomocy przycisku zdarzenia7 jako system.Web.UI.WebControls.Button –

Powiązane problemy