MVC BASICS 2 Kevin Picalausa 1
Forms 2
Action en Method Action Vertelt de Browser naar waar de form data (informatie) door te zenden. URL kan relatief of absoluut zijn. Method De manier waarop de form data doorgezonden wordt. HTTP GET De data waarden (input names) worden in de query string geplaatst. HTTP://www.google.be/search?q=ikdoeict HTTP POST De data waarden worden in de body van de HTTP request geplaatst. 3
GET of POST HTTP GET (+) Bookmarks Hyperlink in email Read only = je kan meerdere keren een GET sturen naar de server (no change of state) HTTP POST (+) Gebruikt voor update, create, delete acties (changes the state) Herhalen van form submits kan ongewenste problemen veroorzaken 4
HTML helper - form @using (Html.BeginForm("Search", "Home", FormMethod.Get)) @Html.Label("Search:") @Html.TextBox("txtSearch") <input type="submit" value="search" /> ActionName: Search ControllerName: Ex. HomeController Method: FormMethod.Get FormMethod.Post <form action="/home/search" method="get"> <label for="search:">search:</label> <input id="txtsearch" name="txtsearch" type="text" value="" /> <input type="submit" value="search" /> </form> 5
HtmlAttributes Bijna elke HTML helper binnen het MVC Framework heeft een htmlattributes parameter. Je kan met een komma gescheiden zo veel attributen toevoegen als gewenst. [!] Het class attribuut is een keyword binnen C# en zal vervangen worden door @class [!] Het - teken zal vervangen worden door een _ omdat dit geen toegestaan teken is binnen C# @using (Html.BeginForm("Search", "Home", FormMethod.Get, new target="_blank", @class="editform", data_validatable=true )) <form action="/home/search" class="editform" data-validatable="true" method="get" target="_blank"> 6
@using (Html.BeginForm("Search", "Home", FormMethod.Get)) @Html.ValidationSummary(true) @Html.ValidationMessage( Name") Geef een overzicht van al de errors die er in de ModelState zitten Validation summary True / false: vertelt de helper of property-level items uit het overzicht dienen gelaten te worden of niet. Je beslist met andere woorden of je enkel model errors wil weergeven of juist enkel diegene niet model-gerelateerd. ModelState.AddModelError("", "De ingevoerde gebruiker is niet gevonden!"); (1) ModelState.AddModelError("Name", "Wat een lelijke naam!"); (2) 1. Model-level error 2. Geassocieerd met een eigenschap (property): Name 7
AntiForgeryToken View: @Html.AntiForgeryToken() Controller: [HttpPost] [ValidateAntiForgeryToken()] Zekerheid dat een formulier (POST actie) ook effectief gegenereerd werd op dezelfde server. Hiermee gaan we CSRF (Cross Site Request Forgery) tegen. 8
CSRF Bron: http://www.opensourceforu.efytimes.com/ 9
Custom entities 10
LINQ2SQL Gratis Business laag Autogenerated Voorgemaakte klassen Wat als we eigenschappen of methoden willen toevoegen zonder alles kwijt te zijn na refresh van het datamodel? 11
Uitbreiding op de bestaande LINQ2SQL klassen. [!] naamgeving dient identiek te zijn als bestaande klasse [!] dient aangemaakt te worden als partial klasse [!] eigenschappen (properties) dienen ook onder identieke naam gebruik te worden [!] binden van het datamodel [MetadataType(typeof(customNewsmessage))] public partial class newsmessage // methoden voor bv. specifieke berichten op te halen Custom Entitie public class customnewsmessage [Required(ErrorMessage = "Vul een titel in!")] [StringLength(50, MinimumLength = 5, ErrorMessage = "Een titel bestaat uit minimum 5 karakters")] [Display(Name = "Titel")] public string title get; set; 12
Validatie en data annotatie 13
Data validatie Binnen het MVC design patroon ligt de nadruk op model validatie. Heeft de gebruiker correcte data ingegeven? Is het getal binnen bereik (bv. 5 55 )? Validatie regels a.d.h.v.: data annotations Validatie opties zijn uitbreidbaard (custom validators) 14
Validatie annotatie Data annotaties kan je terugvinden in de System.ComponentModel.DataAnnotations namespace. Deze attributen zorgen voor server-side validatie. Het framework zorgt bij gebruik binnen een view voor client-side validatie. Client- en server-side validatie is dus in sync (gelijkend => 1 attribuut) Er zijn maar 4 attributen die zorgen voor validatie. 15
Required Het attribuut geeft een fout wanneer: Null Empty [Required(ErrorMessage = "Vul een titel in!")] public string title get; set; @Html.LabelFor(m => m.title) @Html.TextBoxFor(m => m.title) @Html.ValidationMessageFor(m => m.title) 16
StringLength & Range Helpt te voorkomen dat ingevoerde waarden groter zijn dan de vermelde limiet in DB. [Required(ErrorMessage = "Vul een titel in!")] [StringLength(50, MinimumLength = 5, ErrorMessage = "Een titel bestaat uit minimum 5 karakters")] public string title get; set; Minimum en maximum bepaling voor een ingevulde waarde [Range(0,55)] [Range(typeof(decimal), "0.00", "49.99")] public int Age get; set; 17
RegularExpression & Compare Email, datum, telefoonnummer, rekeningnummer, [RegularExpression("^[a-zA-Z0-9_\\.-]+@([a-zA-Z0-9-]+\\.)+[a-zA-Z]2,6$", ErrorMessage = "Email adres is niet correct")] public string email get; set; [Compare("email")] public string EmailConfirm get; set; [EmailAddress(ErrorMessage = "Email adres is niet correct")] public string email_2 get; set; 18
Model binding Het MVC framework voert de validatielogica uit wanneer het model bind. Model binding ter validatie kan enkel plaatsvinden wanneer je het als parameter meegeeft in een Actie-methode. [HttpPost] [ValidateAntiForgeryToken()] public ActionResult insertnews(newsmessage entry) return View(entry); 19
Validation & Model state Modelstate: Bevat al de values die een gebruiker probeerde in te geven via het model. Bevat al de errors die verbonden zijn aan het model. Controller: If( ModelState.IsValid ) ModelState.IsValidField( Name ) ModelState[ Name ].Errors.Count >0 20
Voorbeeld: controle foto upload (Ja/nee) + > 1MB Custom annotation public class ValidateFileAttribute : RequiredAttribute public override bool IsValid(object value) var file = value as HttpPostedFileBase; if (file == null) return false; if (file.contentlength > 1 * 1024 * 1024) return false; return true; [ValidateFile(ErrorMessage = "Gelieve een foto up te loaden, kleiner dan 1MB")] public HttpPostedFileBase file get; set; 21
Display, DisplayFormat Display: set de zichtbare naam voor de model eigenschap. (Label) [AllowHtml] [Required(ErrorMessage = "Vul een bericht in!")] [Display(Name = "Bericht")] public string message get; set; @Html.LabelFor(m => m.message) DisplayFormat: formatting van ingegeven form-data (bv. geld) [Required(ErrorMessage = "*")] [DisplayFormat(DataFormatString = "0:d")] [DataType(DataType.Date)] public DateTime Birthdate get; set; 22
DataType Helpt je om het doel van een property te verfijnen. Bv. Paswoord = Karakters niet leesbaar op scherm. [Required(ErrorMessage = "*")] [DataType(DataType.Password)] [Display(Name = "Paswoord")] public string Password get; set; 23
Viewdata, Viewbag, Session en Tempdata 24
Viewbag en Viewdata Er zijn 3 mechanismen om data van 1 pagina naar een andere over te dragen. Viewbag en Viewdata: het enige verschil tussen beiden is dat je data kan aanspreken a.d.h.v. een property ofwel via een array (string key principe). Infeite schrijven we dus data weg in een dictionary. Communicatie middel tussen de server call (tussen Controller en View) ViewData["Name"] = Kevin"; //Of ViewBag.Name = Kevin"; 25
Tempdata Tempdata: te gebruiken volgens het ViewData principe (dictionary string key array) Verschil: life cycle van het object. TempData["Name"] = "Kevin"; 26
Session //data aan een sessie toevoegen //genereert lijst van producten var products = Db.GetProducts(); //Producten in een sessie wegschrijven Session["products"] = products; //Data terug oproepen var products = Session["products"] as List<Product>; Session: te gebruiken volgens het ViewData principe (dictionary string key array) Zal opgeslagen worden in de Client cookie en kan voor een langere tijd gebruikt worden Tijd: bepaald in web.config //sessie wissen Session["products"] = null; // OF Session.Clear(); 27
Authorization en Membership 28
Authorization Met het AuthorizeAttribute stel je in of een gebruiker binnen je applicatie al dan niet rechten heeft om het ActionResult of zelfs een niveau hoger de controller uit te voeren. [Authorize(Roles = "admin")] Auto redirect naar Login page wanneer geen rechten (web.config) [KevinAuthorize(Roles = "admin")] 29
Custom Authorization public class KevinAuthorizeAttribute : AuthorizeAttribute protected override bool AuthorizeCore(HttpContextBase httpcontext) if (!httpcontext.user.identity.isauthenticated) // no user authenticated return false; // authenticated user string username = httpcontext.user.identity.name; return MyRoleProvider.CheckUserIsInRole(username, this.roles); 30
Membership - Controller // check if new user is created user usr = user.getuserbyemailandpassword(model.email.trim(), hashwithsaltpassword); // check if user exists if (usr!= null) //check if user wants to be remembered if (model.rememberme) FormsAuthentication.SetAuthCookie(usr.id.ToString(), true); else FormsAuthentication.SetAuthCookie(usr.id.ToString(), false); 31
Membership - View @if (Request.IsAuthenticated) <p> Hello, @Html.ActionLink(User.Identity.Name, "Index", "Home")! </p> //Aangemeld else //Login link <p>@html.actionlink("log in", "Index", "Login", routevalues: null, htmlattributes: new id = "login" ) </p> 32