C# - Apró trükkök ASP.NET alkalmazásainkban

forráskód letöltése
Cikkünkben három olyan apró lehetőséget gyűjtöttünk csokorba a Webes alkalmazásfejlesztés tárgykörében, melyek megvalósítása nem tartozik a nehéz feladatok közé, azonban eme lehetőségeket beépítve alkalmazásainkba hasznos funkciókkal gazdagíthatjuk azt. Bemutatjuk, miként jeleníthetünk meg kis információkérő ablakot a weblap töltődésekor, Java-applet használata nélkül. Megismerhetjük, hogyan lehet a HTML-kontrolokhoz többsoros ToolTip-et készíteni, valamint hogy milyen módon tudjuk egy adattábla oszlopainak értékét attribútumként megjeleníteni akkor, amikor XML állományt generálunk egy DataSet objektum tartalmából.
Mellékelt példa megnyitása előtt szükséges egy TipsTricksApp nevű virtuális könyvtár létrehozása, mely a példa könyvtárára mutat. Ehhez nyissa meg a mellékelt mappa Tulajdonság ablakát és itt a Webmegosztás lapon engedélyezze a mappa megosztását olvasási és parancsfájlok futtatási jogával.
Apró, de praktikus fogások lehetnek a most bemutatandó kódsorok, melyeket alkalmazásunkba építve nagyobb feladatok elvégzésére is felhasználhatunk.
Webes dialógusablak
Az első feladatban egy kis párbeszédablakot jelenítünk meg a Web-alkalmazás főlapjának töltődése közben, melyen csak egy TextBox kontrol és egy gomb található azért, hogy a kért információt begyűjtsék és eljuttassák a szerverhez. Annak érdekében, hogy kihasználhassuk a szerver-oldali kontrolok előnyeit, a kis ablakunk egy egyszerű .aspx lap lesz, melyet egy JavaScript kód tölt be. A kis dialógusablakban tetszőleges információ bekérhető a felhasználótól, melyet aztán később felhasználhatunk. Felhasználhatjuk például e-mail cím bekérésére is, mellyel egy hírlevélre jelentkezhet az adott látogató. Mindezt úgy, hogy a hasznos felületet a legkevésbé foglalja.
A betöltést végző kódot egy OpenPopup nevű JavaScript függvényben helyeztük el, mely a HTML BODY tag onload eseményének kezelőfüggvénye lesz. A kis ablakocskát azonban csak a lap első töltődésekor szeretnénk megjeleníteni, ezért a függvényt csak ekkor hívjuk meg. Ennek érdekében egy kis ASP-kóddal befolyásoljuk a BODY tag megjelenését. Első betöltődéskor megadjuk az OpenPopup függvényt kezelőként:
<% if (!IsPostBack)
   {
     Response.Write("<body MS_POSITIONING=\"GridLayout\" onload=\"OpenPopup()\">");
   }
PostBack esetén pedig nem:
   else
   {
     Response.Write("<body MS_POSITIONING=\"GridLayout\" >");
   }
%>
A BODY tag tehát kétféle felépítésben kerül kiírásra a HTML adatfolyamba.
Az ablak megjelenítő függvénye window objektum open metódusát használja a betöltéshez, mely paraméterként megkapja a betöltendő weblap URL-jét, valamint a megjelenítés jellemzőit egy karakterláncban. A beöltendő weblap a Popup.aspx oldal, az alkalmazás virtuális mappájában. Ez tartalmazza a megjelenő ablak méretét, és koordinátáit:
<script language="jscript">
  function OpenPopup()
  {
    window.open("Popup.aspx","","left=200,top=100, width=180, height=60,");
    return;
  }
</script>
A kis ablakban bekérjük a felhasználó nevét, amelyet a Session objektumban helyezünk el a Session SessionID azonosítójával azonosítva. A későbbiekben innen olvassuk ki azt, amikor a gombra kattintunk a webForm1.aspx lapon.
Többsoros ToolTip
Második feladatként egy többsoros ToolTip-et jelenítünk meg a képernyőn akkor, amikor a WebForm1.aspx lapon a ’Megadott név’ feliratú gomb fölé toljuk az egérmutatót.
A HTML kontrolok esetén lehetőség van egy TITLE attribútum megadására, mely tartalmazza a megjelenő szöveget. Annak érdekében, hogy a szöveg tagolt legyen, csak escape szekvenciákat kell beszúrnunk a megfelelő helyekre a karakterláncba, a következő módon:
<INPUT title="A 'MEGADOTT NÉV' feliratú gombra kattintva megjelenik mellette egy cimkén a a felbukkanó ablakban megadott név!" ...>
Látható, hogy kocsi-vissza és line feed nem-nyomtatható karaktereket a ’ ’ karaktersorral adjuk meg.
XML attribútumok
Harmadik érdekesség adattáblákkal és XML állományokkal kapcsolatos munkánkban jöhet jól. A példaprogramban a betöltődés után megjelenő DataGrid kontrol tartalmát egy ’products.xml’ nevű XML állományba írjuk ki a DataSet objektum WriteXml metódusával, paraméterként megadva a létrehozandó állomány nevét.
xmlSet.WriteXml(MapPath("products.xml"));
A DataSet objektum táblája – mely adatforrása a DataGrid kontrollnak – rendelkezik egy speciális oszloppal. Létrehozásakor megadtuk, hogy az oszlop értéke hogyan kerüljön felhasználásra akkor, mikor az XML állomány generálódik a WriteXml metódussal.
Vizsgáljuk meg az adott oszlop létrehozásakor felhasznált konstruktort:
DataColumn
Osztály: DataColumn
public DataColumn(
string columnName,
Type dataType,
string expr,
MappingType type
);
A konstruktorok azon változata, mellyel speciális felhasználásúként jelölhetünk meg egy oszlopot.
Paraméterek
string columnName
A létrehozandó oszlop neve.
Type dataType
Az oszlop típusa.
string expr
Kalkulált mezők esetén a létrehozás egyenlete karakterláncban megadva. Például "UnitPrice * Quantity", vagy dátumok esetén "Birthdate < #1/31/82#".
MappingType type
Egy felsorolt típus egy eleme, mellyel megadjuk, hogy az oszlop hogyan viselkedjen megjelenését tekintve, valamint XML állomány felépítésekor. Elemei lehetnek:
Elem neve Magyarázat
Attribute Az oszlop értéke XML attribútumként fog szerepelni az állományban XML állomány felépítésekor. Például az IMAGE_INDEX oszlopunk a minden rekordot bevezető tagba kerül a következőként: <Products IMAGE_INDEX=”0”>.
Element Az oszlop értéke egy XML elem lesz.
Hidden Az oszlop rejtett lesz.
SimpleContent Az oszlop egy XmlText csomópont lesz.
Példánkban a negyedik oszlopot tehát a következőképpen hoztuk létre:
DataColumn dc4 = new DataColumn("IMAGE_INDEX", Type.GetType("System.String"),"",MappingType.Attribute);
Negyedik paraméterként MappingType.Attribute elemet választottunk.
Az XML állományban minden rekordhoz három adat-oszlop lévén a táblázatban három elem fog tartozni, a negyedik oszlop értéke pedig egy attribútum értéke lesz a Products tagban:
<?xml version="1.0" standalone="yes"?>
<NewDataSet>
  <Products IMAGE_INDEX="0">
    <ID>1</ID>
    <PRODUCT_NAME>Item1</PRODUCT_NAME>
    <UNIT_PRICE>83982</UNIT_PRICE>
  </Products>
  ...
</NewDataSet>