Webes alkalmazások fejlesztése 5. előadás. Adatbevitel és validáció (ASP.NET)

Hasonló dokumentumok
Webes alkalmazások fejlesztése 5. előadás. Adatbevitel és validáció (ASP.NET) Cserép Máté.

Webes alkalmazások fejlesztése 5. előadás. Adatbevitel és validáció (ASP.NET Core) Cserép Máté

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET)

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET) Cserép Máté.

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET Core) Cserép Máté

Webes alkalmazások fejlesztése 6. előadás. Állapotfenntartás (ASP.NET) 2015 Giachetta Roberto

Webes alkalmazások fejlesztése 6. előadás. Állapotfenntartás (ASP.NET) Cserép Máté.

Webes alkalmazások fejlesztése 6. előadás. Állapotfenntartás (ASP.NET) 2015 Giachetta Roberto

Webes alkalmazások fejlesztése 8. előadás. Webszolgáltatások megvalósítása (ASP.NET WebAPI)

Webes alkalmazások fejlesztése 3. előadás. Objektumrelációs adatkezelés (ASP.NET)

Webes alkalmazások fejlesztése 6. előadás. Állapotfenntartás (ASP.NET) Állapotfenntartás. Állapotfenntartás. Állapotfenntartás.

3. Beadandó feladat dokumentáció

Webes alkalmazások fejlesztése 7. előadás. Autentikáció és autorizáció (ASP.NET)

Webes alkalmazások fejlesztése 7. előadás. Autentikáció és autorizáció (ASP.NET Core) Cserép Máté

Webes alkalmazások fejlesztése 1. előadás. Webes alkalmazások és biztonságuk

Webes alkalmazások fejlesztése 10. előadás. Webszolgáltatások tesztelése (ASP.NET Core) Cserép Máté

Webes alkalmazások fejlesztése 8. előadás. Webszolgáltatások megvalósítása (ASP.NET WebAPI)

Eseményvezérelt alkalmazások fejlesztése II 12. előadás. Objektumrelációs adatkezelés (ADO.NET) Giachetta Roberto

A gyakorlat során az alábbi ábrán látható négy entitáshoz kapcsolódó adatbevitelt fogjuk megoldani.

Készítette: Gál Tamás. A tananyag programozott változata itt érhető el: Webfejlesztés

Models are not right or wrong; they are more or less useful.

Weboldalak Biztonsági Kérdései

Java és web programozás

Webes alkalmazások fejlesztése 1. előadás. Webes alkalmazások és biztonságuk. Cserép Máté

Webes alkalmazások fejlesztése 3. előadás. Objektumrelációs adatkezelés (Entity Framework) Cserép Máté.

WEB PROGRAMOZÁS 3.ELŐADÁS. Űrlapok

Felhasználói útmutató a portal.nakvi.hu oldalhoz

Labor leletező program

PHP-MySQL. Adatbázisok gyakorlat

Internet technológiák

Webes alkalmazások fejlesztése

1. ábra Fájl feltöltése 2. ábra Megtekintés

TÁJÉKOZTATÓ az OTH Szakrendszeri Információs Rendszerbe (OSZIR) történő regisztráció és belépés menetéről belföldi partner nevében

Webes alkalmazások fejlesztése. Bevezetés az ASP.NET MVC 5 keretrendszerbe

MŰSZAKI DOKUMENTÁCIÓ. Aleph WebOPAC elérhetővé tétele okostelefonon. Eötvös József Főiskola 6500 Baja, Szegedi út 2.

Webes alkalmazások fejlesztése 2. előadás. Webfejlesztés MVC architektúrában (ASP.NET) Webfejlesztés MVC architektúrában Fejlesztés ASP.

3. Ezután a jobb oldali képernyő részen megjelenik az adatbázistábla, melynek először a rövid nevét adjuk meg, pl.: demo_tabla

API tervezése mobil környezetbe. gyakorlat

WEBFEJLESZTÉS 2. ADATBÁZIS-KEZELÉS, OSZTÁLYOK

Webes alkalmazások fejlesztése. 9. előadás Bevezetés az ASP.NET MVC keretrendszerbe

1. beadandó feladat dokumentáció

Adabáziselérés ODBC-n keresztül utasításokkal C#-ban

Programozási technikák Pál László. Sapientia EMTE, Csíkszereda, 2009/2010

Atlon XML interface fejlesztői dokumentáció. Dokumentum verzió: 3.0

Felhasználói kézikönyv

C#, OOP. Osztályok tervezése C#-ban

Szabadkai Műszaki Szakfőiskola. Web programozás. dr Zlatko Čović

Webes alkalmazások fejlesztése 2. előadás. Webfejlesztés MVC architektúrában (ASP.NET Core) Cserép Máté

JavaServer Pages (JSP) (folytatás)

Webes alkalmazások fejlesztése 6. előadás. Állapotfenntartás (ASP.NET Core) Cserép Máté

Adatbázisok elleni fenyegetések rendszerezése. Fleiner Rita BMF/NIK Robothadviselés 2009

SZÁMÍTÓGÉPES ADATBÁZIS-KEZELÉS. A MySQL adatbáziskezelő PHP folytatás JDBC, ODBC

Webes alkalmazások fejlesztése 2. előadás. Webfejlesztés MVC architektúrában (ASP.NET Core) Cserép Máté

Az SQL*Plus használata

Tájékoztató a szakdolgozat elektronikus feltöltéséről

PHP alapjai, bevezetés. Vincze Dávid Miskolci Egyetem, IIT

Az autorizáció részletes leírása

HVK Adminisztrátori használati útmutató

Tartalomjegyzék 2. RENDSZER FELÉPÍTÉSE... 3

Model View Controller alapú alkalmazásfejlesztés

Hiba bejelentés azonnal a helyszínről elvégezhető. Egységes bejelentési forma jön létre Követhető, dokumentált folyamat. Regisztráció.

Webapp (in)security. Gyakori hibákról és azok kivédéséről fejlesztőknek és üzemeltetőknek egyaránt. Veres-Szentkirályi András

Felhasználói dokumentáció. a TávTagTár programhoz. Készítette: Nyíri Gábor, hdd@nc-studio.com GDF Abakusz regisztrációs kód: GDFAba43

C#---Access adatbáziskezelési gyakorlat

Dokumentumtár A hatósági statisztika adatszolgáltatása lépésről-lépésre

BEJELENTKEZÉS AZ EPK RENDSZERÉBE

BME MOGI Gépészeti informatika 7.

Webes alkalmazások fejlesztése 6. előadás. Weblapok fejlesztése és architektúrája (ASP.NET)

Technikai információk fejlesztőknek

Felhasználói dokumentáció a teljesítményadó állományok letöltéséhez v1.0

Az Egységes Pályázati Keretrendszer használata (akadémiai könyv- és folyóiratkiadási támogatás elnyerésére a 2014.

Regisztrációs segédlet A roma közösségekben dolgozó védőnők. munkafeltételeinek javítása elnevezésű norvég projekt keretében

Új Nemzedék Központ. EFOP pályázatok online beszámoló felülete. Felhasználói útmutató

Példa webáruház kialakítás rendszerdokumentáció

Téradatbázisok használata QGIS-ből A DB kezelő modul 2.2 verzió

Magyar Nemzeti Bank - Elektronikus Rendszer Hitelesített Adatok Fogadásához ERA. Elektronikus aláírás - felhasználói dokumentáció

ASP.NET CORE MVC Model réteg bevezetése Model Binding Repository tervezési minta Dependency Injection Transient és Singleton Custom Binding AutoMapper

PHP. Adatbázisok gyakorlat

Kitöltési útmutató a közös eszközhasználatra kötött megállapodás elektronikus úton történő bejelentésére szolgáló űrlaphoz

Cikktípusok készítése a Xarayában

KIR-STAT 2017 pedagógus adatok feltöltése KIR SZNY elemi adatok alapján Felhasználói útmutató (v.2)

Gyakorlati vizsgatevékenység A

Java Programozás 4. Gy: Java GUI. Tipper, MVC kalkulátor

Felhasználói kézikönyv

az adatbevitel szabályozása, alapok

Tanúsítványkérelem készítése, tanúsítvány telepítése Lotus Domino szerveren

MOL NYRT - WEB ISA 3.0 FELHASZNÁLÓI KÉZIKÖNYV

Tudás Reflektor. Copyright 2011; Kodácsy Tamás;

OKTATÁSKUTATÓ ÉS FEJLESZTŐ INTÉZET TÁMOP-3.1.5/ Pedagógusképzés támogatása

Az importálás folyamata Felhasználói dokumentáció verzió 2.1.

Programozási technológia

APB mini PLC és SH-300 univerzális kijelző Általános használati útmutató

First Voice Kft. Stilldesign Üzletág

Jelentkezési lap képző szervek részére

Egészítsük ki a Drupal-t. Drupal modul fejlesztés

Nokia N97_mini (Mail for Exchange) beállítása Virtualoso levelezésre

TÁJÉKOZTATÓ az OTH Szakrendszeri Információs Rendszerbe (OSZIR) történő regisztráció és belépés menetéről külföldi partner nevében

1. fejezet Bevezetés a web programozásába (Balássy György munkája) Az internet működése... 11

TERC V.I.P. hardverkulcs regisztráció

FRISSÍTÉSI LEÍRÁS A WINIKSZ PROGRAMCSOMAGHOZ

Átírás:

Eötvös Loránd Tudományegyetem Informatikai Kar Webes alkalmazások fejlesztése 5. előadás Adatbevitel és validáció (ASP.NET) 2016 Giachetta Roberto groberto@inf.elte.hu http://people.inf.elte.hu/groberto

Űrlapok Sok esetben szükséges, hogy a felhasználó adatokat vigyen fel a weblapokon (pl. felhasználónév/jelszó), ezt űrlapok (form elem) keretében teheti meg az űrlapokban vezérlőket helyezünk el, amelyeknek tartalmát POST típusú kérésben tudjuk a szerverre küldeni űrlapokat a Html.BeginForm művelettel tudunk létrehozni egy @using blokkba helyezzük, ez megadja a hatókörét az űrlapon belül beviteli mezőket (input elemeket) használunk, elküldéséhez pedig egy gombot (submit típusú input elemet) a value attribútummal megadjuk, a modell mely értékeit (tulajdonságait) visszük be ELTE IK, Webes alkalmazások fejlesztése 5:2

Űrlapok pl.: public class UserData { // a nézetmodell típusa } public Int32 UserId { get; set; } // felhasználó azonosítója public String UserName { get; set; } // felhasználónév public String UserPass { get; set; } // jelszó public String Birthdate { get; set; } // születési idő ELTE IK, Webes alkalmazások fejlesztése 5:3

Űrlapok pl.: @model UserData @using (Html.BeginForm()){ // űrlap kezdete <div>your name: <input name="username" value="@model.username" /> @* szövegbeviteli mező, amelyben a modell UserName tulajdonságát állítjuk be *@ </div> @* további adatbekérés *@ <input type="submit" value="login" /> @* űrlap elküldő gomb *@ } // űrlap vége ELTE IK, Webes alkalmazások fejlesztése 5:4

Űrlapok Az űrlapok ugyanúgy egy akciót futtatnak, ám átadják ennek az akciónak a bevitt modell adatokat alapértelmezetten ugyanazt az akciót futtatják, amely létrehozta a nézetüket, de ezt paraméterben megadhatjuk, illetve lehetősünk van átirányításra, pl.: @using (html.beginform("index", "LoginController", )) a vezérlőben megadhatjuk, hogy egy akció csak a GET, vagy POST kérésre hajtódjon végre (HttpGet és HttpPost attribútum), így szétválasztható a két működés attribútumok nélkül egy műveletben kell a két állapotot kezelni (mivel ilyenkor túlterhelés nem engedélyezett) ELTE IK, Webes alkalmazások fejlesztése 5:5

Űrlapok pl.: public class LoginController : Controller { [HttpGet] // ez fut le az oldal betöltésére public ActionResult Index(){ return View(); // itt még csak üresen // prezentáljuk a nézetet } [HttpPost] // ez fut le az űrlap elküldésére public ActionResult Index(UserData data) { // paraméterben megkapjuk az űrlapban // kitöltött modellt } ELTE IK, Webes alkalmazások fejlesztése 5:6

Adatbevitel űrlapokban Az űrlapon belül a beviteli mezőket műveletek segítségével is előállíthatjuk, pl.: @Html.TextBox("userName", "@Model.UserName") Az űrlapon belül a beviteli mezőket (erősen típusos nézetben) egy adott tulajdonságra is generálhatjuk, pl.: @Html.TextBoxFor(m => m.username) A következő beviteli mezőket használhatjuk: szövegdoboz (TextBox), szövegmező (TextArea), jelszómező (Password) kijelölő (CheckBox), rádiógomb (RadioButton), legördülő menü (DropDownList), lista (ListBox) ELTE IK, Webes alkalmazások fejlesztése 5:7

Adatbevitel űrlapokban pl.: @model UserData @using (Html.BeginForm()){ // űrlap kezdete <div>your name: @Html.TextBoxFor(m => m.username)</div> <div>your password: @Html.PasswordFor(m => m.userpass)</div> @* a beviteli mezőket generáljuk a tulajdonságokhoz *@ <input type="submit" value="login" /> } // űrlap vége ELTE IK, Webes alkalmazások fejlesztése 5:8

Példa Feladat: Valósítsuk meg az utazási ügynökség weblapjának foglalási funkcióját, azaz egy apartmant kiválasztva legyen lehetőség a foglaló adatival adott hetekre lefoglalni. felveszünk egy új vezérlőt, amely a foglalásokat felügyeli (RentController), a vezérlőben az Index művelet szolgálja ki a GET és POST kéréseket (paramétere az apartman, illetve utóbbinak a megadott adatok) A vezérlőhöz két nézetet veszünk fel: egyikben űrlapban megadjuk az adatokat (Index) egy másikban visszajelezzük, hogy sikeres volt a foglalás (Result), és megadjuk a teljes összeget ELTE IK, Webes alkalmazások fejlesztése 5:9

Példa a foglalás és a foglaló adatait az adatbázisban két külön táblában tároljuk (Rent, Guest) kiegészítjük az entitásmodell osztályait kényelmi funkciókkal (Rent típust az ütközésdetektálással, Apartment típust a hét napjának lekérdezésével) az adatokat egyszerre szeretnénk bekérni, így létrehozunk egy nézetmodell osztályt (RentViewModel) minden megadott adatot ellenőrzünk, mielőtt mentenénk (pl. mezők kitöltöttsége, foglalási időpontok megfelelősége, illetve ütközése) amíg nem hibátlan a kitöltés, visszairányítjuk a kitöltő oldalra (és megjelenítünk egy hibaüzenetet is) ELTE IK, Webes alkalmazások fejlesztése 5:10

Példa Tervezés (adatbázis): ELTE IK, Webes alkalmazások fejlesztése 5:11

Példa Tervezés (alkalmazás): Controller Controllers::RentController - _entities :TravelAgencyEntities View Rent::Result View Rent::Index + Index(Int32?) :ActionResult + Index(Int32?, RentViewModel) :ActionResult + RentController() Models::RentViewModel «property» + Apartment() :Apartment + GuestAddress() :String + GuestEmail() :String + GuestName() :String + GuestPhoneNumber() :String + RentEndDate() :DateTime + RentStartDate() :DateTime + TotalPrice() :Int32 Controller Controllers::HomeController - _entities :TravelAgencyEntities + Details(Int32?) :ActionResult + HomeController() + Image(Int32?, Boolean) :FileResult + ImageForBuilding(Int32?) :FileResult + Index() :ActionResult + List(Int32?) :ActionResult View Home::Details View Home::Index ELTE IK, Webes alkalmazások fejlesztése 5:12

Példa Megvalósítás (Rent/Index.cshtml): @* megjeleníthetünk üzeneteket *@ @if (ViewBag.Error!= null) { <div...>@viewbag.error</div> } @using (Html.BeginForm()) { // egy űrlapban töltjük ki a tartalmat @Html.TextBoxFor(rent => rent.customername, new { size = "40" }) @* szövegbeviteli mezőt generálunk, amelynek megadjuk a méretét is *@ ELTE IK, Webes alkalmazások fejlesztése 5:13

Példa Megvalósítás (RentController.cs): [HttpPost] public ActionResult Index(Int32? apartmentid, RentInformation rent) { // végrehajtjuk az ellenőrzéseket if (String.IsNullOrEmpty(rent.CustomerName) ){ ViewBag.Error = "Hiányosak a foglaló adatai!"; return View("Index", rent); } ELTE IK, Webes alkalmazások fejlesztése 5:14

Adatbevitel űrlapokban Amennyiben nem ismerjük előre a modelltulajdonság típusát, használhatunk dinamikusan generált elemeket: az Editor művelet dinamikusan generálja a beviteli mezőt a Label művelet címkét hoz létre a megadott tulajdonsághoz, míg a Display csak olvasható módon jeleníti meg a tartalmat Amennyiben nem egyenként szeretnénk bekérni a tartalmat, a teljes nézetmodell összes adatát megjeleníthetjük (LabelForModel, DisplayForModel), vagy szerkeszthetjük (EditorForModel) ekkor célszerű annotációkkal felruházni a nézetmodellt ELTE IK, Webes alkalmazások fejlesztése 5:15

Adatbevitel űrlapokban pl.: @model UserData // felhasználói adatok @using (Html.BeginForm()){ // űrlap kezdete <div>@html.labelfor(m => m.username): @Html.EditorFor(m => m.username)</div> @* a szerkesztő és a címke is dinamikus *@ <div>@html.labelfor(m => m.birthdate): @Html.EditorFor(m => m.birthdate)</div> @* itt egy dátumbekérő fog megjelenni *@ <input type="submit" value="login" /> } // űrlap vége ELTE IK, Webes alkalmazások fejlesztése 5:16

Adatbevitel űrlapokban pl.: @model UserData // felhasználói adatok @using (Html.BeginForm()){ // űrlap kezdete @Html.EditorForModel() @* a teljes modelltartalmat szerkeszthetővé tesszük *@ <input type="submit" value="login" /> @* már csak a bejelentkező gombra van szükség *@ } // űrlap vége ELTE IK, Webes alkalmazások fejlesztése 5:17

Űrlapok modelljei A nézetmodellünket, és annak tulajdonságait számos annotiációval (attribútummal) megjelölhetjük, amelyek az űrlapmezők dinamikus generálását befolyásolják így a generáláskor jobban szabályozhatjuk az adatok megjelenítésének/bekérésének módját pl.: megjelenő címke (Display), illetve tartalom megjelenés formátuma (DisplayFormat) elrejtés (HiddenInput) specifikusabb adattípus (DataType), illetve beviteli mező specifikálása (UIHint) ELTE IK, Webes alkalmazások fejlesztése 5:18

Űrlapok modelljei pl.: [DisplayName("User login:")] // megadjuk a bekérő lapnak a címszövegét public class UserData { [HiddenInput(DisplayValue=false)] // ez a mező rejtett lesz, így nem // jelenik meg public Int32 UserId { get; set; } // azonosító [Display(Name="Your name:")] // a címkén a megadott szöveg jelenik meg public String UserName { get; set; } // felhasználónév ELTE IK, Webes alkalmazások fejlesztése 5:19

Űrlapok modelljei [Display(Name="Your password:")] [UIHint("Password")] // a szerkesztőmező egy jelszómező lesz public String UserPass { get; set; } // jelszó } [Display(Name="Your birthday:")] [DisplayFormat(DataStringFormat="yy.MM.dd")] [DataType(DataType.Date)] // csak a dátum fog megjelenni, a megadott // formátumban public DateTime Birthdate { get; set; } // születési dátum ELTE IK, Webes alkalmazások fejlesztése 5:20

Megjelenítő sablonok Megjelenítő (DisplayFor), illetve beviteli (EditorFor) mezőnek nem csak beépített elemeket, hanem általunk létrehozott parciális nézeteket is használhatunk, mint sablonokat (display template) ezeket a Views/Shared/DisplayTemplate könyvtárba helyezzük a tulajdonság ennek a nézetnek a modellje lesz pl.: [Display(Name="Your name:")] [UIHint("MyNameDisplay")] // a MyNameDisplay.cshtml nézetet tölti be public String UserName { get; set; } ELTE IK, Webes alkalmazások fejlesztése 5:21

Validáció A felhasználótól bekért adatokat mindig ellenőriznünk kell, ez a modell validációja, amely a következő lépésekből áll: 1. a kliens oldalon, amint a felhasználó elküldi az űrlapot: ellenőrizzük, hogy a szükséges adatokat megadták ellenőrizzük, hogy a típusa és formátumuk helyes (pl. e- mail, dátum) jelezzük a felhasználónak, ha bármilyen probléma van 2. sikeres ellenőrzés esetén az adatok a szerverre kerülnek 3. a szerver oldalon ismét lefutnak az ellenőrzések, immár biztonsági ellenőrzéseket is futtatva 4. hiba esetén visszajelzünk a kliensnek, egyébként mentünk ELTE IK, Webes alkalmazások fejlesztése 5:22

Validáció kliens űrlap kitöltés szerver adat ellenőrzés sikeres űrlap ellenőrzés hibajelzés sikertelen sikeres sikertelen adat mentés ELTE IK, Webes alkalmazások fejlesztése 5:23

Validáció A validáció elvégezhető csak szerver oldalon, vagy kliens és szerver oldalon a szerver oldali ellenőrzés mindenképpen szükséges, főleg támadások kivédése miatt a validálás elvégezhető teljesen manuálisan, vagy használhatóak beépített eszközök Szerver oldalon a modell állapotát a vezérlőben a ModelState tulajdonságon keresztül tudjuk kezelni az IsValid érték megadja, hogy minden szükséges érték megtalálható, és típusa megfelelő az AddModelError művelettel jelezhetünk egy hibát ELTE IK, Webes alkalmazások fejlesztése 5:24

Validáció pl.: public class LoginController : Controller { [HttpPost] public ActionResult Index(UserData data) { if (String.IsNullOrEmpty(data.UserName)) // ha üresen hagyták a nevet ModelState.AddModelError("UserName", "User name is required!"); // jelezzük a hibát a tulajdonságra if (ModelState.IsValid) // ha egyébként jók az adatok } ELTE IK, Webes alkalmazások fejlesztése 5:25

Validáció a nézetben A hibákat globálisan, vagy az egyes tulajdonságokra egyenként is megadhatjuk (előbbi esetben nem adjuk meg a tulajdonságot) A nézetben a hibajelzéseket jelezhetjük egy tulajdonságra a Html.ValidationMessageFor művelet írja ki a jelzett hibaüzenetet a teljes modellre Html.ValidationSummary művelet írja ki a hibaüzeneteket paraméterben megadhatjuk, hogy az egyes tulajdonságok hibáit is kiírja, vagy csak azokat, amelyekhez nem adtunk meg tulajdonságot (Html.ValidationSummary(true)) ELTE IK, Webes alkalmazások fejlesztése 5:26

Validáció a nézetben pl.: @using (Html.BeginForm()){ <div> @Html.ValidationSummary(true, "Errors:") @* a globálisan jelzett hibák *@ </div> <div> @Html.LabelFor(m => m.username): @Html.EditorFor(m => m.username) @Html.ValidationMessageFor(m => m.username) @* a UserName-re jelzett hiba *@ </div> ELTE IK, Webes alkalmazások fejlesztése 5:27

Validáció a nézetmodellben Lehetőségünk van a nézetmodellen közvetlenül megadni ellenőrzési kritériumokat, automatizálva az ellenőrzést a feltételeket tulajdonságonként szabályozhatjuk, és megadhatjuk a hibaüzenetet (ErrorMessage) megadhatjuk a kötelező kitöltést (Required), szöveghosszt (StringLength), reguláris kifejezést (RegularExpression), intervallumot (Range), összehasonlítást más tulajdonsággal (Compare), illetve speciális formátumot (Url, Phone, CreditCard, EmailAddress, ) a Validation osztály TryValidateObject metódusával az ellenőrzés elvégezhető manuálisan is ELTE IK, Webes alkalmazások fejlesztése 5:28

Validáció a nézetmodellben pl.: public class UserData { [Required(ErrorMessage="User name is required.")] [StringLength(15, "User name cannot be longer, than 15 characters.")] [RegularExpression("^[a-z0-9_-]{3,15}$", "User name has invalid characters.")] // feltételek a felhasználónévre public String UserName { get; set; } // felhasználónév } ELTE IK, Webes alkalmazások fejlesztése 5:29

Példa Feladat: Valósítsuk meg az utazási ügynökség weblapjának foglalási funkcióját, azaz egy apartmant kiválasztva legyen lehetőség a foglaló adatival adott hetekre lefoglalni. a megjelenítéshez és validációhoz annotációkat használunk a RentViewModel osztályban a hét napja, illetve a tengerpart típusa speciális megjelenítést igényelnek több oldalon, ezért a korábbi lambda-kifejezéseket cseréljük le egy-egy parciális nézetre (DayOfWeekDisplay, ShoreTypeDisplay), és használjuk fel ezeket a megjelenítésre ehhez a megfelelő entitásosztályokat is kiegészítjük ELTE IK, Webes alkalmazások fejlesztése 5:30

Példa Megvalósítás (RentViewModel.cs): public class RentViewModel { [Required(ErrorMessage = "Az e-mail cím megadása kötelező.")] [EmailAddress(ErrorMessage = "Az e-mail cím nem megfelelő formátumú.")] [DataType(DataType.EmailAddress)] public String GuestEmail { get; set; } } ELTE IK, Webes alkalmazások fejlesztése 5:31

Példa Megvalósítás (RentContoller.cs): public ActionResult Index(Int32? apartmentid, RentViewModel rent){ // végrehajtjuk az ellenőrzéseket if (rent.rentstartdate < DateTime.Now + TimeSpan.FromDays(7) ) ModelState.AddModelError("RentStartDate",); if (!ModelState.IsValid) return View("Index", rent); } ELTE IK, Webes alkalmazások fejlesztése 5:32

Példa Megvalósítás (Rent/Index.cshtml): <strong>tengerpart típus: </strong> @Html.DisplayFor(r => r.apartment.building. ShoreType) @* meghívjuk az egyedi megjelenítőnket *@ @Html.EditorFor(rent => rent.guestemail, new { htmlattributes = new { size = "40" } }) @* a szerkesztőelemet a modell szabja meg, de így befolyásolhatjuk a méretét *@ @Html.ValidationMessageFor(rent => rent.guestemail); ELTE IK, Webes alkalmazások fejlesztése 5:33

Kliens oldali validáció A kliens oldali validációt Javascript segítségével végezzük a legegyszerűbb a jquery Validation programcsomag használata, amely automatikusan kezelni tudja a szerver oldali modellben lévő annotációkat, pl.: <script src="jquery-2.1.3.min.js"> <script src="jquery.validate.js"> <script src="jquery.validate.unobtrusive.js"> a validáció az űrlap beküldése előtt, még kliens oldalon megtörténik (voltaképpen az annotációk megfelelő módon beépülnek a HTML vezérlőkbe) ELTE IK, Webes alkalmazások fejlesztése 6:34

Kliens oldali validáció a validáció nyelv specifikus formátumokat nem támogat (pontosabban csak az en-us nyelvi környezetet támogatja) nyelvfüggő elemek (pl. dátum) esetén használjuk a jquery Globalize és jquery Validation Globalize programcsomagokat, pl.: <script src="globalize.js"> <script src="globalize.culture.hu-hu.js"> <script src="jquery.validate.globalize.min.js"> <script type="text/javascript"> $(function(){ Globalize.culture("hu-HU"); }); // nyelvi környezet beállítása </script> ELTE IK, Webes alkalmazások fejlesztése 6:35

Biztonsági ellenőrzések A felhasználó által felvitt adatok kártékony információkat is tartalmazhatnak, ezért biztonsági szempontból is fontos a validálás, a legjellemzőbb támadások: SQL injekció: a szerveren futó SQL utasításokat manipulálja entitásmodell használata esetén nem fordulhat elő cross-site scripting (XSS): szkript kerül feltöltésre a szerverre, amelyet a kliens böngészője futtat a bevitel eleve tiltja a HTML elemeket tartalmazó adatok feldolgozását, de ez kikapcsolható (ValidateInput) az adatok tartalmát megjelenítéskor a Html.Encode utasítással kódolhatjuk, így biztosan nem kerül értelmezésre a szkript ELTE IK, Webes alkalmazások fejlesztése 5:36

Biztonsági ellenőrzések cross-site request forgery (XSRF): a felhasználó átirányítása, és egy kérés végrehajtása a tudta nélkül a felhasználó elküldi az űrlapot tartalommal (POST), anélkül, hogy megadta volna adatait ez elkerülhető, ha megbizonyosodunk róla, hogy a kitöltést és a küldést is ugyanazon kliens végezte ehhez az űrlapban elhelyezünk egy tokent (Html.AntiForgeryToken()), amely információkat közöl a klienssel az akció végrehajtásakor lekérhetjük a tokent (ValidateAntiForgeryToken attribútum), ha a két érték egyezik, akkor nem volt támadás ELTE IK, Webes alkalmazások fejlesztése 5:37

Példa Feladat: Valósítsuk meg az utazási ügynökség weblapjának foglalási funkcióját, azaz egy apartmant kiválasztva legyen lehetőség a foglaló adatival adott hetekre lefoglalni. elvégezzük kliens oldalon is a validációt, a dátum ellenőrzéséhez használjuk a nemzetközi csomagot (_Layout.cshtml) az aktuális nyelvi beállítást elkérhetjük a nézettől (Culture tulajdonság) az XSRF támadások ellen is védjük az oldalt a megfelelő helyeken (Rent/Index.cshtml, RentController) ELTE IK, Webes alkalmazások fejlesztése 5:38

Példa Feladat: Valósítsuk meg az utazási ügynökség weblapjának foglalási funkcióját, azaz egy apartmant kiválasztva legyen lehetőség a foglaló adatival adott hetekre lefoglalni. a vezérlőkben található üzleti logikát célszerű kihelyezni külön osztályba, legyen ez a TravelService biztosítja a kapcsolatot a perzisztenciával, az adatok lekérdezését, a foglalás végrehajtását az adatok ellenőrzését is elvégzi, a műveletek logikai értékkel, vagy hibakóddal térnek vissza (pl. RentDateError) egy segédosztály (RentDateValidator) ellenőrzi a dátumokat ELTE IK, Webes alkalmazások fejlesztése 5:39

Példa Tervezés (alkalmazás): Controller Controllers::RentController - _travelservice :ITravelService + Index(Int32?) :ActionResult + Index(Int32?, RentViewModel) :ActionResult + RentController() «enumeration» Models:: RentDateError None StartInvalid EndInvalid LengthInvalid Conflicting -_travelservice «interface» Models::ITravelService + GetApartment(Int32?) :Apartment + GetBuilding(Int32?) :Building + GetBuildingImage(Int32?, Boolean) :Byte[] + GetBuildingImageIds(Int32?) :IEnumerable<Int32> + GetBuildingMainImage(Int32?) :Byte[] + GetBuildings(Int32?) :IEnumerable<Building> + GetBuildingWithApartments(Int32?) :Building + GetPrice(Int32?, RentViewModel) :Int32 + NewRent(Int32?) :RentViewModel + SaveRent(Int32?, RentViewModel) :Boolean «property» + Buildings() :IEnumerable<Building> + Cities() :IEnumerable<City> Models::TravelService - _entities :TravelAgencyEntities Models::RentDateValidator + Validate(DateTime, DateTime, Int32) :RentDateError -_entities DbContext Models::TravelAgencyEntities ELTE IK, Webes alkalmazások fejlesztése 5:40

Példa Megvalósítás (RentContoller.cs): public ActionResult Index(Int32? apartmentid) { // létrehozunk egy foglalást csak az // alapadatokkal (apartman, dátumok) RentViewModel rent = _travelservice.newrent(apartmentid); if (rent == null) // ha nem sikerül (nem volt azonosító) return RedirectToAction("Index", "Home"); // visszairányítjuk a főoldalra } return View("Index", rent); ELTE IK, Webes alkalmazások fejlesztése 5:41

Példa Megvalósítás (TravelService.cs): public Boolean SaveRent(Int32? apartmentid, ){ // ellenőrizzük az annotációkat if (!Validator.TryValidateObject(rent, new ValidationContext(rent, ), null)) return false; // ellenőrizzük a dátumot if (RentDateValidator.Validate( rent.rentstartdate, rent.rentenddate, apartmentid.value)!= RentDateError.None) return false; ELTE IK, Webes alkalmazások fejlesztése 5:42