19

Click here to load reader

Dsr 6

Embed Size (px)

Citation preview

Page 1: Dsr 6

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

Page 2: Dsr 6

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()

{

}

}

Page 3: Dsr 6

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>

Page 4: Dsr 6

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()

Page 5: Dsr 6

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 };

}

Page 6: Dsr 6

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

Page 7: Dsr 6

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; }

}

Page 8: Dsr 6

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

Page 9: Dsr 6

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

Page 10: Dsr 6

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

Page 11: Dsr 6

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>

<% } %>

Page 12: Dsr 6

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)

%>

Page 13: Dsr 6

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()

Page 14: Dsr 6

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

Page 15: Dsr 6

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>

Page 16: Dsr 6

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

Page 17: Dsr 6

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

Page 18: Dsr 6

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

Page 19: Dsr 6

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; }