Click here to load reader
Upload
dejan-stamulak
View
81
Download
3
Embed Size (px)
Citation preview
3/29/2011
1
PONOVITEV
Model za prikaz podatkov
Običajno je, da izdelamo model, ki se uporablja
samo za prikaz podatkov
Model za pogled zgradimo v aplikativni kodi
Ne spada v pogled – po nepotrebnem bi še bolj
obremenili HTML z izvorno kodo
Ne spada v krmilnik – krmilnik preklaplja med pogledi
in vodi aktivnosti
3/29/2011
2
Prenos modela v pogled
Krmilnik preda model pogledu takrat, kadar vrne
pogled:
return View(model);
Model se prenese v pogled s pomočjo objekta
ViewData
ViewData.Model
Hkrati je v strogo tipiziranem pogledu dostopen
neposredno z lastnostjo “Model”
Kako izdelamo model
Model izdelamo v aplikativni logiki
Npr.
public class PodatkovnaBazaStudentov
{
public IEnumerable<Student> VrniVse()
{
…
}
}
3/29/2011
3
C# - yield
Uporablja se v ponavljalnih blokih za vračanje vrednosti enumeratorju ali za sporočanje konca ponovitve
yield return <izraz>
yield break;
Izraz mora biti možno implicitno pretvoriti v tip, ki ga vrača enumerator
IEnumerable<Tip>
Lahko ga uporabljamo v metodi ali atributu/lastnosti
Uporaba modela v pogledu
V strogo tipiziranem pogledu dostopamo do modela neposredno z uporabo lastnosti “Model”
<table>
<% foreach (var vrstica in Model)
{%>
<tr>
<td><%: vrstica.Lastnost %></td>
</tr>
<% } %>
</table>
3/29/2011
4
Zapleteni modeli pogleda
Model pogleda je lahko tudi bolj zapleten
Vsebuje večje število enostavnih podatkov
Vsebuje večje število zbirk/polj – tabel
Je ločen na več delov – glava, noga
Dobro izdelan model vse skupaj združi v en razred
Natančno ponazarja podatke, ki se uporabljajo v
pogledu
Pomožne metode za obrazce
Html.LabelFor()
Html.TextBoxFor()
Html.TextAreaFor()
Html.PasswordFor()
Html.HiddenFor()
Html.RadioButtonFor()
Html.CheckboxFor()
Html.DropDownListFor()
Html.ListBoxFor()
3/29/2011
5
Html.DropDownListFor
<%=Html.DropDownListFor(model => model.Ime,
Razred.GetItems()) %>
<select id="Ime" name="Ime">
<option value="Novak">Janez</option>
<option value="Novak 1">Janez ena</option>
<option value="Novak 2">Janez dva</option>
</select>
Html.DropDownListFor
Primer metode, ki vrača seznam podatkov za prikaz
Primer modela pogleda, uporablja specifičen tip za seznam!
public static IEnumerable<SelectListItem> GetItems()
{
List<SelectListItem> list = new List<SelectListItem>();
list.Add(new SelectListItem { Text = "Janez", Value = "Novak" });
SelectListItem item = new SelectListItem();
yield return new SelectListItem { Text = "Janez", Value = "Novak"};
yield return new SelectListItem { Text = "Janez ena", Value = "Novak 1" };
yield return new SelectListItem { Text = "Janez dva", Value = "Novak 2" , Selected=tue };
}
3/29/2011
6
Html.DropDownListFor
Kot dodatni parameter lahko navedemo ime
vrednosti, ki se prikaže, ko ni izbran noben podatek
<%=Html.DropDownListFor(model => model.Ime,
Razred.GetItems(), "Izberite vrednost...") %>
Dodatno lahko nastavimo poljubne atribute elementa kot
pri ostalih elementih obrazcev
Zapleteni modeli
Modeli za vpis in prikaz podatkov
V enem modelu lahko združimo tako podatke za vpis
podatkov kot za njihov prikaz
V modelih lahko tudi gnezdimo razred v razredu
Skladno z vsebino prikaza
3/29/2011
7
Primer pogleda
Pogled s seznamom prijavnic
V seznamu lahko izberemo prijavnice za odjavo od
izpita
Primer pripadajočega modela
public class Prijavnica
{
public string Ime{ get; set; }
public string Priimek { get; set; }
public string Vpisna { get; set; }
public string PrijavnicaVnos Vnos { get; set; }
public class PrijavnicaVnos
{
public int Stevilka { get; set; }
public bool Odjava { get; set; }
}
3/29/2011
8
OSNOVE POGLEDA
Odgovornosti pogleda
So zelo enostavne
Uporabi model in s podatki v njem sestavi prikaz
vsebine
Tehnologije, uporabljene v pogledu
HTML
CSS
JavaScript
C# oz. tehnika povezovanja modela in pogleda
3/29/2011
9
Kako MVC izbere pogled?
Krmilnik se glede na vpisane podatke odloči, kaj bo
prikazal
Vrne objekt ActionResult
public ActionResult SpremeniGeslo()
{
return View();
}
Kako nastane pogled?
Proženje metode “View()” nakazuje, kot da se
pogled ustvari v krmilniku
Vendar je metoda “View()” samo pomožna metoda,
ki vrne objekt ActionResult
Objekt ActionResult vsebuje vse podatke, ki bodo
potrebni za prikaz pogleda, npr.:
Ime pogleda
Model
3/29/2011
10
Prenos podatkov v pogled
Najpomembnejši objekt za prenos podatkov v
pogled je ViewBag
ViewBag je dinamični objekt
Lahko mu določimo latnosti, ne da bi jih prej definirali
Če lastnost ne obstaja, bo v času izvajanja program
javil napako (izjemo)
Primer kode v krmilniku:
ViewBag.Ime = “Janez”;
Strogo tipizirani pogledi z modelom
pogleda
Pogledi lahko dedujejo od dveh razredov:
System.Web.Mvc.ViewPage ali
System.Web.Mvc.ViewPage<T>
Če uporabimo različico z generikom, določimo
strogo tipiziran pogled
V pogledu pridobimo
Strogo tipizirano lastnost Model
Strogo tipiziran pomožni objekt HtmlHelper
Strogo tipiziran pomožni objekt AjaxHelper
3/29/2011
11
Primer modela pogleda
public class UporabnikPortala
{
[Required] (1)
[DisplayName(“Uporabniško ime")] (2)
public string Uporabnik{ get; set; }
}
(1) in (2) sta atributa za anotacijo podatkov
Prikaz podatkov modela pogleda v
pogledu
Praviloma uporabimo HtmlHelper objekt za prikaz podatkov
<% foreach (var profil in Model) { %>
<tr>
<td>
<%= Html.Encode(profil.Uporabnik) %>
</td>
<td>
<%= Html.Encode(profil.Vloga)%>
</td>
...
</tr>
<% } %>
3/29/2011
12
Varnost
Zaradi zaščite pred napadi “Cross-site Scripting –
XSS)
Pretvorimo besedilo pred prikazom v pogledu tako, da
prikažemo namesto uporabimo morebitne HTML
elemente v podatkih
V MVC3 lahko <%= Html.Encode( zamenjamo z
<%:
Prednosti stroge tipizacije
Kadar uporabimo strogo tipiziran pogled
Lahko uporabimo vgrajene pomožne objekte za izpis
HTML elementov
Izognemo se uporabi “magičnih nizov”
<%= Html.LabelFor(m => m.Uporabnik) %>
<%= Html.TextBoxFor(m => m.Uporabnik) %>
<%= Html.ValidationMessageFor(m => m.Uporabnik)
%>
3/29/2011
13
Strogo tipizirane predloge
Pri večanju števila funkcij rešitve se v pogledu pojavlja vse več vzorcev
Bool vrednosti so običajno prikazane kot “checkbox”
Elektronska pošta ima vedno enako obliko
Datum ima vedno enako obliko
Večina vnosnih polj vsebuje neko obliko validacije pravilnosti in veljavnosti podatkov
HtmlHelper metode postanejo z naraščanjem zapletenosti nezadostne
Uporabimo pomožne predloge
Vrste predlog
HTML koda za prikaz in za urejanje podatkov se
praviloma bistveno razlikuje
Zato ločimo metode za prikaz in urejanje
Html.Display(“Sporocilo")
Html.DisplayFor(m => m.Sporocilo)
Html.DisplayForModel()
Html.Editor(" Sporocilo ")
Html.EditorFor(m => m.Sporocilo)
Html.EditorForModel()
3/29/2011
14
Predloge
Čeprav se lahko pri prikazu predlog sklicujemo na
model tudi z nizom, se temu izogibamo
Html.Display(“Sporocilo")
Urejevalnik podatkov lahko torej prikličemo tudi z
metodo
Html.EditorForModel()
Za vsako javno dostopno lastnost izdela urejevalnik
Nastavljanje značilnosti predstavitve
Nastavljanje značilnosti prikaza podatkov je
omejeno – ne moremo vsega označiti v modelu
pogleda:
[Required]
[DisplayName(“Uporabniško ime")]
public string Uporabnik{ get; set; }
Predloge so skupne za celo spletno mesto
3/29/2011
15
Preverjanje veljavnosti podatkov
if (ModelState.IsValid)
{
…
return RedirectToAction(“…");
}
else
{
return View();
}
Prikaz posameznih polj s predlogami
Kadar ne želimo spreminjati predloge za celotno spletno mesto, uporabimo predloge samo za posamezna polja
<p>
<%= Html.EditorFor(m => m.StaroGeslo) %>
</p>
<p>
<%= Html.EditorFor(m => m.NovoGeslo) %>
</p>
3/29/2011
16
Vgrajene predloge za prikaz
EmailAddress
Prikaže “mailto” povezavo
HiddenInput
Vstavi skrito vrednost
Html
Izpiše vrednost s HTML vsebino
Text
Izpiše izvirno (surovo) vsebino
Url
Izpiše povezavo
Collection
Izpiše podatke po predlogi za vsak element v IEnumerable
Vgrajene predloge za prikaz
Boolean
Prikaže “checkbox” za true/false boolean tipe
Prikaže “dropdown” za “Nullable” boolean tipe
Decimal
Formatira vrednost z dvema decimalkama
String
Prikaže surovo vsebino
Object
Prikaže vsebino vseh lastnosti objekta
3/29/2011
17
Vgrajene predloge za urejanje
HiddenInput
Vstavi skriti element v obrazec
MultilineText
Vstavi večvrstično vnosno polje
Password
Vstavi vnosno polje za geslo
Text
Vstavi enovrstično vnosno polje
Vgrajene predloge za urejanje
Collection
Prikaže urejevalnik za vsak element v Ienumerable
Boolean Prikaže “checkbox” za true/false boolean tipe
Prikaže “dropdown” za “Nullable” boolean tipe
Decimal Prikaže vnosno polje z dvema decimalkama
String Vstavi enovrstično vnosno polje
Object Prikaže urejevalnik za vse lastnosti objekta
3/29/2011
18
Izbira predloge
Interno se predloga izbere na podlagi imena
MVC išče predloge po naslednjem vrstnem redu:
<Area>/<ControllerName>/EditorTemplates/< ImePredloge >.ascx (ali .aspx)
<Area>/Shared/EditorTemplates/<ImePredloge>.ascx (ali.aspx)
Če predloga ne obstaja ali pa se ne uporablja področje:
<ControllerName>/EditorTemplates/<ImePredloge>.ascx (ali .aspx)
Shared/EditorTemplates/<ImePredloge>.ascx (ali .aspx)
Ime predloge
Ime predloge se določi po naslednjem vrstnem redu:
Ime podano v pomožni metodi (privzeto prazno)
Vrednost ModelMetadata.TemplateHint
Podamo z uporabo atributa [UIHint]
Vrednost ModelMetadata.DataTypeName
Podamo z uporabo atributa [DataType]
Tip modela
Če ni sestavljen tip: String
Če je IEnumerable: Collection
Katerikoli drugi vmesnik: Object
3/29/2011
19
Vrste predlog
Lahko deduje od ViewUserControl (.ascx končnica)
Lahko deduje od ViewPage (.aspx končnica)
Omogoča uporabo specifične “MasterPage” predloge
Primer določanja tipa
using System.ComponentModel.DataAnnotations;
[UIHint("EmailAddress")]
public string EPosta { get; set; }
[DataType(DataType.EmailAddress)]
public string EPosta { get; set; }