2009-09-29 12 views
18

Page_Load nie jest metodą wirtualną. Co nazywa tę metodę i jak to robi? Czy to odbicie czy jakaś inna technika? Jak wiele wydarzeń jest obsługiwanych w ten sposób?Co nazywa Page_Load i jak to robi?

Czy lepiej radzić sobie z przeciążeniem OnLoad lub Page_Load? Czym się różnią?

Odpowiedz

21

Program ASP.NET ma funkcję o nazwie "AutoEventWireup" - ta funkcja umożliwia tworzenie metod o sygnaturze EventHandler o nazwach takich jak Page_Load, a środowisko wykonawcze będzie wiązało zdarzenie ze strony nadrzędnej z metodą w klasie. Zasadniczo runtime robi to w Twoim imieniu:

this.Load += this.Page_Load; 

Teraz lepiej jest wyłączyć AutoEventWireup i albo utworzyć te procedury obsługi zdarzeń się na łamach OnInit metody lub po prostu zastąpić OnLoad metodę stronie macierzystej.

Edytuj (w odpowiedzi na poniższy komentarz PO): Proces ten nie obejmuje kliknięć przycisków i takie, ale proces jest podobny.

Aby sposobu jak MyButton_Click do pracy bez jawnie tworzenia obsługi zdarzeń będzie trzeba ustawić atrybut OnClick sprawie kontroli w pliku aspx tak:

<asp:button 
    id="MyButton" 
    onClick="MyButton_Click" 
    runat="server" /> 

To poprosi ASP. NET, aby utworzyć delegata przycisku kliknięcia i załączyć go do zdarzenia Click przycisku.

+0

czy obejmuje to również kontrolę z identyfikatorami? Czy możesz napisać MyButton_Click? –

+0

Dlaczego zalecenie wyłączania AutoEventWireup? – M4N

+0

@Martin: Generacja delegatów do powiązywania odbywa się w czasie wykonywania i jest wolniejsza niż tylko przesłonięcie metody. @ Orion: nie obejmuje kliknięć przycisków i takie, ale proces jest podobny.Aby metoda taka jak "MyButton_Click" działała bez konieczności jawnego tworzenia procedury obsługi zdarzeń, musisz ustawić atrybut 'OnClick' na formancie w pliku aspx, tak jak poniżej:' OnClick = "MyButton_Click" '. Spowoduje to, że program ASP.NET utworzy dla Ciebie delegata przycisku kliknięcia i doda go do zdarzenia 'Click' przycisku. –

1

Proszę spojrzeć na ASP.NET page lifecycle, istnieje sekcja dla zdarzeń cyklu życia, w której opisuje obciążenie.

obciążenia
strony wywołuje zdarzenie onload sposób na stronie, następnie rekurencyjnie robi to samo dla każdej kontroli dziecka, który robi to samo dla każdego z jej kontroli dziecko do strony i wszystkie formanty są ładowane. Użyj metody zdarzenia OnLoad , aby ustawić właściwości w kontrolkach i nawiązać połączenia z bazami danych .

Dalsze Cytat:

Należy pamiętać, że podczas tworzenia wydarzenie obsługi przy użyciu składni Page_event, realizacja baza jest niejawnie nazywa, a zatem nie trzeba nazywać go w metodzie. Dla przykładu metoda klasy strony bazowej OnLoad jest zawsze wywoływana, niezależnie od tego, czy tworzysz metodę Page_Load, czy nie. Jeśli jednak zastąpisz metodę OnLoad na stronie za pomocą słowa kluczowego zastąpienia (przesłanianie w języku Visual Basic), , musisz jawnie wywołać metodę bazową . Na przykład, jeśli zastąpisz metodę metodą OnLoad na stronie, musisz wywołać metodę base.Load (MyBase.Load w Visual Basic) w celu wykonania implementacji podstawowej .

+0

To zabawne, że konieczność jawnego pokazania wydarzenia jest zawsze postrzegana jako niepotrzebna, podatna na błędy i nużąca. Niektórzy ludzie mogą twierdzić, że nadpisywanie OnLoad (i wywoływanie base.OnLoad) dodaje do aplikacji czas kompilacji i klarowność. :) – bzlm

4

Kolejność metody wirtualnego (OnLoad) i obsługi zdarzeń (page_load) nazywane jest określona przez tzw page lifecycle. Jest to po prostu sposób w jaki środowisko wykonawcze ASP.NET przetwarza przychodzące żądanie (np. Z etapami Init, Load, Render).

Można użyć onload lub Page_Load, ale trzeba zdawać sobie sprawę z tego, co się dzieje:

  • wewnątrz onload trzeba zadzwonić base.OnLoad
  • wewnątrz base.OnLoad zdarzenie obciążenia zostaną podniesione
  • Page_Load jest programem obsługi zdarzenia Load (które jest automatycznie łączone) i dlatego będzie wywoływany w wyniku wywołanego zdarzenia Load.

Jeśli nie zadzwonisz pod numer base.OnLoad w trybie nadpisania OnLoad, wówczas zdarzenie Load nie zostanie wywołane.


Aktualizacja: można użyć pustą stronę z następującego kodu z opóźnieniem, aby zobaczyć co się dzieje:

protected override void OnInit(EventArgs e) 
{ 
    base.OnInit(e); 
    base.Load += new EventHandler(My_Page_Load); 
} 

void My_Page_Load(object sender, EventArgs e) 
{ 
    Response.Write("My_Page_Load<br/>"); 
} 

protected override void OnLoad(EventArgs e) 
{ 
    Response.Write("Start of OnLoad<br/>"); 
    base.OnLoad(e); 
    Response.Write("End of OnLoad<br/>"); 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    Response.Write("Page_Load<br/>"); 
} 

Spróbuj komentując base.OnLoad (e) połączenie i zobaczyć ponownie.

1

W dyrektywy page on mówi: AutoEventWireup = "true"

Ów, co się dzieje, jej automatycznie przewodowe do zdarzenia Wczytaj ... (i niektórych innych wydarzeń, takich jak PreInit, init, rozładować etc.)

2

Metoda OnLoad gdzieś w hierarchii stron wywołuje zdarzenia przypisane do Load (via + =).

Nazewnictwo Page_Load to tylko konwencja. W trybie AutoEventWireUp (tzn. Nie jawnie zadeklarowana żadna procedura obsługi zdarzeń) konwencja ta służy do wyszukiwania procedur obsługi zdarzeń według ich nazw.

Jeśli masz .Net1 dostępny, można zobaczyć, jak projektant dodaje kod do OnInit strony użytkownika(), aby dodać wszystkie składniki i ustaw

this.Load += new System.EventHandler(this.Page_Load); 

.Net2 nadal to robi, ale w osobny plik ukryty gdzieś pod Windows \ Microsoft.Net \ Framework \ v * \ Tymczasowe pliki ASP.Net.

Znajduję this chart na stronie życia strony ASP.Net bardzo przydatne.