április, 2008 havi archívum
AJAX Control Toolkit –
NumericUpDownExtender
Ez egy példaalkalmazáshoz tartozó leírás! Az alkalmazás erről a címről tölthető el:
http://devportal.hu/Portal/Detailed.aspx?NewsId=6a497b55-e21d-4bc5-beb2-a9e64c6ca24e vagy
Kicsit hosszabb kihagyás után, visszacsöppenve az Ajax világába, folytatom tovább a félbehagyott ACT-t bemutató sorozatunkat. Ma a NumericUpDownExtender a soros!
NumericUpDownExtender alapok
Ezen extender segítségével a WinForms-os világból jól ismert NumericUpDown vezérlőt tudjuk webalkalmazásainkban megvalósítani. A NumericUpDown kontroll arra lett kitalálva, hogy egy egyszerű és jól használható felületet biztosítson egy szövegdobozon belüli érték növelésére/csökkentésére. A TextBox mellett található két gomb, melyek segítségével tudjuk növelni, illetve csökkenteni a TextBox értékét.
A NUDE annyival tud többet a winforms-os társánál, hogy nem csak numerikus értékek növelését, illetve csökkentését lehet vele egyszerűen megvalósítani, hanem akár egy saját enumerátoron is könnyedén végigiterálhatunk vele! Sőt akár még a gombokat is lecserélhetjük egyedi képekre!
NUDE használata
A példaalkalmazásunkban a kedvenc vezérlőnknek, vagyis a Calendar-nak fogjuk egy újabb implementációját elkészíteni (Születési dátumot fogunk bekérni a felhasználótól). Ne keressünk benne értelmet, én azért választom mindig a naptárat, mivel eléggé egyszerű elkészíteni és mellesleg tökéletes állatorvosi ló. Kezdjünk is hozzá a fejlesztéséhez!
Év
Először az évbeállító szövegdobozt készítsük el. Húzzunk a formunkra egy TextBox-ot, majd pedig egy NumericUpDownExtender-t! A szövegdoboz fölé írjuk oda, hogy Év! A TextBox-on egyetlen módosítást végezzünk el, igazítsuk középre a szöveget: (style="text-align:center;")! Kapcsoljuk össze a NUDE-t és a szövegdobozt a TargetControlID tulajdonság segítségével!
Az október 20.-ai ACT release-ben megjelent két új tulajdonsága a nude-nak, még pedig a Miminum, illetve a Maximum. Ezek tök jól használhatóak lennének az alkalmazásunkban, ha működnének! Ugyanis, ha a Miminum értéknek 20-nál nagyobb számot adunk meg, akkor javascript error-t kapunk. Hát eléggé ciki, de ez van!
Ezért ha határok közé szeretnénk szorítani a születési évet, akkor más módszerhez kell folyamodnunk. Szerencsére a nude növelését, illetve csökkentését webszolgáltatásokon keresztül is meg lehet valósítani. A webmetódusaink szignatúrája az alábbi módon néz ki: int IncrementValue (int current, string tag). Magyarul az aktuális értéket a current paraméteren keresztül kapjuk majd meg és egy egész típusú értékkel kell majd visszatérnünk. A nude-nak van egy Tag nevű tulajdonsága is, amelyen keresztül bármilyen adatot átpasszolhatunk a webservice-nek. Tehát a tag a már korábban megismert ContextKey paraméternek felel meg!
Külön lesz egy növelő, illetve egy csökkentő webmetódusunk, ezért az alábbi módon állítsuk be a NUDE vezérlőnket:
<ajaxToolkit:NumericUpDownExtender ID="NUDE_year" runat="server"
TargetControlID="txtbox_year"
Width="120"
ServiceDownMethod="DecrementValue"
ServiceUpMethod="IncrementValue" />
Mivel a Default.aspx oldalon belül fogjuk majd mindkét webmethod-ot megírni, ezért nem kell külön megadnunk a ServiceDownPath, illetve ServiceUpPath tulajdonságokat!
Egy kicsit furcsának találom, hogy a nude-on keresztül kell beállítanunk a TextBox szélességét a Width tulajdonság segítségével, de ez van, meg kell szokni! Mellesleg a neten található példaalkalmazásokban a szövegdobozoknak külön kézzel is beállítják a méretüket, bár szerintem teljesen felesleges, ugyanis nem veszi figyelembe a nude a TextBox eredeti méretét!
Most készítsük el a két eget rengetően bonyolult webmetódusunkat! Íme, az oldal head részébe elhelyezendő kódjuk:
<script runat="server">
[System.Web.Services.WebMethod]
[System.Web.Script.Services.ScriptMethod]
public static int IncrementValue(int current, string tag)
{
if(current < 2005) current++;
return current;
}
[System.Web.Services.WebMethod]
[System.Web.Script.Services.ScriptMethod]
public static int DecrementValue(int current, string tag)
{
if (current > 1901) current–;
return current;
}
</script>
Ha a nude-tól átvesszük a növelés, illetve csökkentés terhét, akkor a felhasználó csak a gombok segítségével tudja változtatni a TextBox értékét, direktbe nem tudja módosítani (readonly = true)! Ez egyfelől jó, ugyanis így biztosan int értéket fog kapni a webservice. Másfelől viszont rossz, ugyanis ha „távol” vagyunk a kívánt évtől, akkor elunjuk az életünket, amire kattintgatásokkal elérjük.
Ha most elindítjuk az alkalmazásunkat, akkor azt láthatjuk, hogy a TextBox-unk Text értéke megegyezik a double negatív alsóhatárával. Ezért, ha most rákattintunk valamelyik gombra, akkor exception-t fogunk kapni. Azért, hogy ezt elkerüljük, állítsuk be a szövegdoboz értékét mondjuk 1950-re!
Hónap
A hónapbeállító szövegdobozunkat szintén megoldhatnánk webszolgáltatásokkal, de van egy egyszerűbb megoldás is. Kihasználjuk azt, hogy a nude képes általunk megszabott értékek között ugrálni. Az enumerátor értékeit a RefValue tulajdonságon keresztül tudjuk megadni.
Ismét húzzunk a formunkra egy TextBox-ot, illetve egy NUDE-ot, majd írjuk föléjük, hogy Hónap! A szövegdoboz Text-jét itt is igazítsuk középre, majd a nude-ot az alábbi módon állítsuk be:
<ajaxToolkit:NumericUpDownExtender ID="NUDE_month" runat="server" TargetControlID="txtbox_month" Width="120"
RefValues="Január;Február;Március;Április;Május;Június;Július;Agusztus;Szeptember;Október;November;December" />
Amint az a kódból látható, az enumerátorunk értékeit pontosvesszővel elválasztva kell felsorolni. Ha a RefValue-t beállítjuk, akkor szintén csak olvasható lesz a TextBox-unk, de legalább a Text default értéke az enum első eleme lesz! Az esélyegyenlőség miatt mégis állítsuk be a szövegdobozunk szövegét Júniusra!
Ez mind szép és jó, működik is, de nem eléggé izgi. Ezért egy kicsit tuningoljuk fel a nude vezérlőnket, cseréljük le a gombjait! Két ImageButton-nel fogjuk leváltani az eredeti gombokat. Egy kis érdekesség: amikor kicseréljük a gombokat másikakra, akkor az új button-öket nem közvetlenül az eredetiek helyére fogja tenni a NUDE, hanem ott hagyja, ahová tettük a markupban. Tehát ha azt szeretnénk, hogy a szövegdoboz bal oldalán legyenek a léptető gombok, akkor egyszerűen a TextBox elé tegyük be a két ImageButton-t!
Állítsunk be mindkettőnél valamilyen képet, majd pedig mondjuk meg a nude-nak, hogy ezekre kattintva léptesse a hónapos szövegdobozunk értékét. A TargetButtonUpId, illetve a TargetButtonDownId tulajdonságok segítségével tehetjük meg mindezt. Íme, a hónap megadós rész markup kódja egyben:
<b>Hónap</b><br/>
<asp:ImageButton ID="imgbtn_up" runat="server" ImageUrl="~/Img/increment.png" />
<asp:ImageButton ID="imgbtn_down" runat="server" ImageUrl="~/Img/decrement.png" />
<asp:TextBox ID="txtbox_month" runat="server" style="text-align:center;">Június</asp:TextBox>
<ajaxToolkit:NumericUpDownExtender ID="NUDE_month" runat="server"
TargetControlID="txtbox_month" Width="120"
RefValues="Január;Február;Március;Április;Május;Június;Július;Agusztus;Szeptember;Október;November;December"
TargetButtonUpID="imgbtn_up" TargetButtonDownID="imgbtn_down"/>
Nap
Utolsó komponensként készítsük el a születési dátum napbeállítós részét! Ahhoz, hogy itt a hónapnak megfelelő napok közül választhassuk (pl.: Február esetén 1 és 28 vagy 29 között, vagy Március esetén 1-től 31-ig) szükségünk van a másik két TextBox aktuális értékére is! Webservice-ből direktben nem tudjuk elérni őket, csak indirektben, például ha a tag paraméterben átpasszoljuk az értékeket! Ez javascriptben némi kis bűvészkedéssel megoldható, de semmiféleképpen nem szép megoldás, ezért most mutatok egy hasznos kis trükköt, hogy hogyan lehet ezt elegánsan megoldani!
A trükk lényege, hogy amikor a NUDE megváltozik, akkor mi kézzel PostBack-et váltunk ki, amelyet utána aszinkron kezelünk le. Ugye mennyivel szebb!
Először írjuk ki a formunkba, hogy Nap, majd utána húzzunk be alá egy UpdatePanel-t! Az UP ContentTemplate-jében helyezzünk egy TextBox-ot, illetve egy NUDE-t! A szövegdoboz szövege legyen 15 és középre zárt! A nude-nál állítsuk be a TargetControlID-t, a Widht-ot, illetve a BehaviorID-t! Az utolsó értéke legyen nude! Erre azért van szükségünk, hogy a későbbiekben tudjunk majd rá hivatkozni java scriptből!
Végül az UP-hez vegyük fel aszinkron trigger-nek a TextBox-unk TextChanged eseményét! Valahogy így kéne kinézni a markupunknak:
<asp:UpdatePanel ID="UP" runat="server">
<ContentTemplate>
<asp:TextBox ID="txtbox_day" runat="server">15</asp:TextBox>
<ajaxToolkit:NumericUpDownExtender BehaviorID="nude" ID="NUDE_day" runat="server" TargetControlID="txtbox_day" Width="120" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="txtbox_day" EventName="TextChanged" />
</Triggers>
</asp:UpdatePanel>
Folytassuk most a fejlesztést egy kis kliensoldali programozással!
A javascript kódunknak összesen az alábbi két feladata lesz:
– feliratkozni a nude változásfigyelő eseményére
– változás esetén postbacket generálni.
Ezt így valósíthatjuk meg a legegyszerűbben:
<script type="text/javascript">
function pageLoad()
{
var nude = $find("nude");
nude.add_currentChanged(onChanged);
}
function onChanged(sender, args)
{
__doPostBack("<%=txtbox_day.ClientID %>","");
}
</script>
A dolog érdemi részével meg is vagyunk, már csak a logikát kell az egész mögé ültetni! Iratkozzunk fel a txtbox_day TextChanged eseményére! Az eseménykezelő függvényében először kérjük el a txtbox_year értékét, majd határozzuk meg, hogy szökőév-e! Utána a txtbox_month-ban lévő hónap alapján állítsuk be a nude_day Maximum tulajdonságát!
Eddig itt tartunk kód-ügyileg:
int year = Convert.ToInt32(txtbox_year.Text);
string month = txtbox_month.Text;
int daynumber = 0;
if (month == "Február" && IsSzokoEv(year)) daynumber = 29;
else daynumber = 28;
switch (month)
{
case "Január":
case "Március":
case "Május":
case "Július":
case "Augusztus":
case "Október":
case "December":
daynumber = 31;
break;
case "Április":
case "Június":
case "Szeptember":
case "November":
daynumber = 30;
break;
}
NUDE_day.Maximum = daynumber;
Most készítsük el a szökőév ellenőrző függvényünket az alábbi módon:
bool IsSzokoEv(int year)
{
bool szokoev = false;
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) szokoev = true;
return szokoev;
}
Az alkalmazásunk elkészült, működik is, csak nem éppen hatékony. Ugyanis mindenegyes léptetésnél lefut a teljes kódunk (szökőév ellenőrzéssel együtt), feleslegesen! Ezért iktassunk be egy TextBoxChanged függvényt, amely megmondja, hogy az előző léptetés óta megváltozott-e a kiválasztott év vagy hónap! Ehhez a TextChanged lefutásakor tároljuk el Session-ben az aktuális értékeket:
…
Session["lastyearvalue"] = txtbox_year.Text;
Session["lastmonthvalue"] = txtbox_month.Text;
A változást figyelő függvényünket így már könnyű implementálni:
bool TextBoxChanged()
{
bool changed1 = false, changed2 = false;
if (Session["lastyearvalue"] != null)
changed1 = (txtbox_year.Text!=(string)Session["lastyearvalue"]);
if (Session["lastmonthvalue"] != null)
changed2 = (txtbox_month.Text!=(string)Session["lastmonthvalue"]);
if (changed1 || changed2)
return true;
else
return false;
}
Végül tegyük az egész TextChanged kódunkat egy nagy if-be, ahol leellenőrizzük, hogy történt-e változás, vagy egyáltalán be lett-e már állítva a nude_day Maximuma:
if ((NUDE_day.Maximum != Double.MaxValue)) || this.TextBoxChanged())
{
…
}
Így sem lesz tökéletes az alkalmazásunk, de legalább már valamivel hatékonyabb, mint a változásfigyelés előtt!
Bővebb infó: http://msportal.hu/
Ja és holnap én leszek a témafelelős, ha minden igaz, tehát SILVERLIGHT nap lesz!
Tegnap volt szerencsém egy nem sokára megrendezésre kerülő konferencia főpróbáján részt venni. Ez a konferencia nem más, mint a NETAcademia által szervezett Ethical Hacking. Igen jól olvastátok tényleg ez a címe, és tényleg arról is szól, mint amit a címben ígérnek.
A rendezvény célja, hogy a nagyközönség is megismerje a hackerek által leggyakrabban használt technikákat, és ezeket ki tudja majd a jövőben védeni vagy legalábbis időben fel tudja majd ismerni őket! Az előadásokon sorra végigveszik a legismertebb technikákat pl.: ARM poisoning, cross-site scripting, rootkits, social engineering, stb.
Nekem őszintén szólva kifejezetten tetszett a konferencia, bár volt egy-két apró kivetni való dolog benne (pl.: a bemutató terem nem lépcsőzetes volt, nem esett szó a szivárványtáblákról, meleg volt a kóla). Én csak ajánlani tudom mindenki ezt a rendezvényt, mind fejlesztőknek, mind üzemeltetőknek, mind pedig végfelhasználóknak, hogy egy átfogó képet kaphassunk arról, hogy miért is nem beszélhetünk biztonságról!
Íme a konferencia napirendje, illetve hivatalos oldala:
https://www.netacademia.net/content.aspx?txt=ethconference
Wi-Fi hacking,
avagy a kibertér fosztogatása
Előadó: Baki Gábor (Infobia, penetration tester), MCSE+Security, CISA, CEH, MCT
"Dögvész" a hálózaton,
avagy hogyan birtokoljunk vagy tegyünk tönkre egy teljes hálózatot
Előadó: Deim Ágoston (Linux Support Center), CEH, CISM, MCP, MCT
Egy szög miatt a patkó elveszett,
avagy mi az, amit már ma ki tudnál javítani
Előadó: Rideg Márton (MKB Bank, osztályvezető, informatikai üzemeltetés), ITIL-F
Mi az a MITM?
Subattacks, avagy hogyan védjük adatainkat belső switchelt hálózaton
Előadó: Fóti Marcell (NetAcademia, vezető oktató), CEH, Security MVP, MCSE+Security, MCT since 1995, MCDBA, MZ/X
Social Engineering,
avagy "Az a gyanús, ami nem gyanús!" (Virág Elvtárs)
Előadó: Novák Zsolt (Regulation Consulting, Informatikai Biztonságirányítási Auditor)
Rootkitek a mindennapokban,
avagy kell ez nekem?
Előadó: Csiszér Béla (Sicontact, NOD32, ügyvezető, vírusszakértő), CEH
SSL hacking,
avagy mire figyeljünk még titkosított kommunikáció esetén is
Előadó: Rózsahegyi Zsolt (Netlock, ügyvezető, PKI-szakértő)
szerk.: a főpróba a netacademia-nál volt, ahol nem 100 fős előadásokat szoktak tartani, ezért volt a "terem" választás rossz. Természetesen az éles előadás moziteremben lesz!
Hogyan írhatunk shell script-eket?
Ilyen és ehhez hasonló kérdésekre próbálok meg válaszolni a mai (NEM UTOLSÓ) blogbejegyzésemben. Na, megint blöfföltem (tudjátok, hogy van ez, ha egyszer rászokik az ember :-). Természteseten nem áll szándékomban se shell script-ről se más pingvin mintás dolgokról írni, azt meghagyjuk az állatbarátoknak.
Magyarországon a bloggolás valahogy kicsit más érzést vált ki az emberekből, mint például amerikában. MO-n sokan a blogra úgy tekintenek, mint egy elektronikus naplóra, emiatt teli van a net a "levittem ma a kutyimat sétálni" és "ma megint nem történt velem semmi érdekes", illetve "7: 00 megpróbáltam felkelni" "7:03 nem sikerült" stílusú blogokkal.
Szerintem ez nem jó! Ha megnézzünk néhány nagyobb külföldi blogot, akkor azt láthatjuk, hogy az emberek megköszönnik a cikkben olvasható információkat. (pl.: ScottGu blogjegyzéseihez fűzött kommentek ~60%-a tartalmazza a thanks vagy a nice szavak valamelyikét! Jó mondjuk az is hozzátartozik, hogy egy-egy bejegyzését annyian nézik meg egy nap alatt, mint az enyémet egy év alatt.. )
</off>
Page.Reponse – yes, that it’s, what we need!
Többmint 30 országból voltak látogatói az oldalnak!