Mechanizm dziedziczenia jest ogólnie znany oraz chętnie wykorzystywany w programowaniu obiektowym. Nie wiedzieć czemu w aplikacjach internetowych stosuje się go raczej rzadko. W tym artykule chciałbym zaprezentować jak wykorzystać dziedziczenie w sprytny sposób w aplikacji webowej.
Rozpoczynamy tworząc pustą solucję w VS z aplikacją internetową. Do projektu webowego dodajemy jedną stronę aspx oraz klasę o nazwie BasePage. Klasa ta dziedziczyć będzie po System.Web.UI.Page, czyli po standardowej stronie Web Form. Przechodzimy do wnętrza klasy BaseBage i zaczynamy pisać override, następnie ’Spacja’ i ukazuje się nam lista elementów, które możemy nadpisać/przeładować:
Wybieramy opcję podświetloną na powyższym zrzucie ekranu – OnLoad. W ciele metody, która została utworzona dopisujemy na przykład poniższy kawałek kodu:
protected override void OnLoad(EventArgs e) { Response.Write("BasePage - before right page<br />"); base.OnLoad(e); Response.Write("BasePage - after right page<br />"); }
Następnie wracamy do przykładowej strony, do pliku .cs, a w nim do deklaracji klasy strony i zmieniamy jej dziedziczenie z Page na BasePage. W zdarzeniu Page_Load również dopisujemy Response.Write(“Hello world”). W tym momencie warto uruchomić aplikację i zobaczyć jak skorelowane jest działanie logiki, którą właśnie utworzyliśmy. Zauważyć można, iż w pierwszej kolejności ukazał się napis zawierający “before right page”, następnie napis “Hello world” z przykładowej strony, kończąc napisem z zawartością “after right page”. Zadanie to miało na celu uświadomić w jakiej kolejności wykonywane są instrukcje w powiązanych plikach.
Na tym etapie znajomości wykonywania poleceń, kod naszej klasy BasePage można zmodyfikować następująco:
public class BasePage : System.Web.UI.Page { const string APPLICATION_NAME = "BasePage test application"; protected override void OnLoad(EventArgs e) { this.Title = string.Format("{0} - {1}", APPLICATION_NAME, this.Title); base.OnLoad(e); } }
Przykładową stronę modyfikujemy nadając jej tytuł w pliku .aspx. Uruchamiając teraz aplikację dostrzec można, iż strona nosi tytuł “BasePage test application – First page”.
Inną możliwością, jaką możemy obdarzyć naszą klasę to właściwość (properties), deklarując ją przykładowo w poniższy sposób:
protected int? Id { get { return (int?)ViewState["_Id"]; } set { ViewState["_Id"] = value; } }
Odwołać się do niej można poprzez słowo kluczowe this. Identyczne działanie wykorzystać można w przypadku metod. Przykładowo w BasePage:
protected void RegisterJsVar(string varName, string varValue) { System.Web.UI.ScriptManager.RegisterStartupScript( this, GetType(), "Vars", string.Format("var {0} = '{1}'; {2}", varName, varValue.Replace("'", "\'"), Environment.NewLine), true ); }
wykorzystanie w Page_Load:
public partial class Default : BasePage { const string JS_VAR_NAME = "jsVarName"; protected void Page_Load(object sender, EventArgs e) { this.RegisterJsVar(JS_VAR_NAME, "jsValue"); } }
na koniec widoczne rezultaty w kodzie HTML:
Powyższe przykłady to tylko trywialne możliwości zastosowania kalsy BasePage. Taka klasa doskonale sprawdza się również w sytuacjach, kiedy aplikacja internetowa nie posiada strony wzorcowej (MasterPage). Potrafi wtedy niesamowicie ułatwić życie programiście.