C# - Frame-eket tartalmazó web site-ok létrehozása

forráskód letöltése
Ha olyan web site-ot tervezünk létrehozni, ahol nem csak egy lapból épül fel az oldal, hanem frame-ek segítségével többől, akkor a Visual Studio.NET az ilyen jellegű fejlesztéseinket is támogatja.
Ezt a lehetőséget választva egy lap több ASPX oldalból tevődhet össze, természetesen minden oldal más és más kinézetű és funkciójú lehet.
Frame-ek használatához tegyük a következőt, miután létrehoztunk egy új webes projektet: válasszuk a File - Add new item menüpontot. A megjelenő ablakban keressük elő a Frameset elemet. Ekkor megjelenik egy újabb ablak, melyben néhány előre gyártott frame elrendezés közül választhatunk. Válasszuk ki a számunkra megfelelőt. Ha ilyet nem találnánk, akkor sincs gond, mert a választás után a frame-ek teljesen egyedien átszabhatók, így utólag bármilyen elrendezés megadható.
Választás után létrejön egy Framset1.htm nevű állomány, hacsak nem választottunk számára más nevet. A Solution Explorer-ben most kattintsunk jobb gombbal ezen az állományon és válasszuk a Set As Start Page menüpontot. Ezzel azt értük el, hogy alkalmazásunk futtatásakor ez a htm lap lesz az alapértelmezett, vagyis ez jelenik meg először. Most még persze üresen, így célszerű futtatás előtt némi tartalommal ellátni.
A mellékelt példában mi a Header, Footer and Contents típusú frame készletet választottuk, melyhez összesen négy oldal szükséges, ezért létrehozunk négy WebForm-ot, melyek Header, Footer, Contents és Main nevet kapják. E négy lap tartalma jelenik meg egyetlen oldalon, mindegyik lap egy-egy frame-ben. Ahhoz, hogy a Frameset1 is tudjon erről a tervünkről, ahhoz meg kell adnunk számára ezt az információt. Váltsunk át HTML nézetre a Frameset1.htm lapon. Itt találunk is egy-két megjegyzést - melyet a Visual Studio.NET szúrt be - arról, hogy mi a teendőnk.
Minden frame esetén meg kell adnunk annak src paraméterében, hogy mi is lesz az adott frame forrása:
    <frame name="header" src="Header.aspx" scrolling="no" noresize>
Ha ezzel megvagyunk, akkor nincs más dolgunk, mint a négy Web Form-unkon létrehozni a megfelelő tartalmat, kinézetet. Ilyenkor az egyes Web Form-okon ugyanúgy dolgozhatunk mintha azok önálló Form-ok lennének, de egy dolgot tartsunk szem előtt: a frame-ek mérete általában korlátozott és ebből az következik, hogy ha egy frame mondjuk 64 pixel magas lehet csak, akkor a területén megjelenő Web Form-ból is csak 64 pixel magasságú rész fog látszani. Ha persze a frame scrollozható (scrolling="yes"), akkor nem baj, ha a Form kilóg a frame-ből. Ez persze mindig az adott feladattól függ, hogy mikor melyik megoldás a jó.
Van még egy fontos tényező, melyet frame-ek használatakor figyelembe kell venni. Képzeljük el a következő esetet: van egy frame baloldalon és egy jobb oldalon. A bal oldali frame-be egy menüsort helyezünk el, melynek az a célja, hogy egy-egy elemének kiválasztásakor a jobb oldali frame-ben jelenjen meg a menüponthoz rendelt tartalom. Ekkor rendelkeznünk kell arról, hogy egy-egy link, vagy átirányítás (Response.Redirect) melyik frame-re vonatkozzon, mivel alapesetben mindig a saját frame-re történik a hivatkozás, ami a példánk esetében azt eredményezné, hogy a baloldali menüpont kiválasztásakor a tartalom is a baloldalon jelenne meg, ami ugye nem épp a várakozásunknak megfelelő.
Mellékelt példánknál is ez a feladat került megvalósításra, nézzük miként:
Válasszuk ki a Content.aspx lapot, mely a példában a bal oldali frame-en jelenik meg és váltsunk html nézetre. Itt annyit kell tennünk, hogy a html kód head szekciójába beírjuk az alábbit:
    <base target="main">
Ezzel megváltoztattuk az alapértelmezett célt. Vagyis, ha a Content.aspx lapon linket helyezünk el, vagy használjuk az átirányítást és nem adjuk meg külön a célt (<a href=”…” target=…>), akkor alapértelmezésben a main nevű frame lesz a cél, mely a példánkban a jobb oldali.
Így a Content.aspx lapon elhelyezett nyomógombhoz nyugodtan írhatunk átirányítást, annak tartalma már a jobb oldali frame-en jelenik meg, úgy ahogy arra szükségünk is van.
    private void Button1_Click(object sender, System.EventArgs e)
    {
      Response.Redirect("m"+(sender as Button).Text+".aspx");
    }