ASP.NET MVC 3 - Presentare i dati nella View

51
ASP.NET Sviluppo applicazioni web e linguaggio HTML LEZIONE 05 Model View Controller

description

Mostrare i dati all'utente nelle View con Razor

Transcript of ASP.NET MVC 3 - Presentare i dati nella View

Page 1: ASP.NET MVC 3 - Presentare i dati nella View

ASP.NET

Sviluppo applicazioni web e linguaggio HTML

LEZIONE 05

Model View Controller

Page 2: ASP.NET MVC 3 - Presentare i dati nella View

Model

Page 3: ASP.NET MVC 3 - Presentare i dati nella View

Con le View

mostriamo i dati

all’utente

Page 4: ASP.NET MVC 3 - Presentare i dati nella View

Quali dati?

Page 5: ASP.NET MVC 3 - Presentare i dati nella View

Quelli del model …

Page 6: ASP.NET MVC 3 - Presentare i dati nella View

Quelli del model …

Visualizziamo in homepage il numero totale di

post e commenti utilizzando il DbContext

Page 7: ASP.NET MVC 3 - Presentare i dati nella View

Quelli del model …

Visualizziamo in homepage il numero totale di post

e commenti utilizzando il DbContext e LINQ to Entities

int totalPosts = 0, totalComments = 0;

using (var db = new BlogContext())

{

totalComments = db.Comments.Count();

totalPosts = (from p in db.Posts

where p.IsPublished

select p).Count();

}

Page 8: ASP.NET MVC 3 - Presentare i dati nella View

… e nella vista i dati

come li trasportiamo?

Page 9: ASP.NET MVC 3 - Presentare i dati nella View

In una valigia, ovviamente …

ViewBag

Page 10: ASP.NET MVC 3 - Presentare i dati nella View

dynamic al quale

possiamo assegnare

proprietà arbitrarie

ViewBag

Page 11: ASP.NET MVC 3 - Presentare i dati nella View

dynamic al quale

possiamo assegnare

proprietà arbitrarie

ViewBag.TotalPosts

Page 12: ASP.NET MVC 3 - Presentare i dati nella View

int totalPosts = 0, totalComments = 0;

using (var db = new BlogContext())

{

totalComments = db.Comments.Count();

totalPosts = (from p in db.Posts

where p.IsPublished

select p).Count();

}

ViewBag.TotalPosts = totalPosts;

ViewBag.TotalComments = totalComments;

ViewBag.TotalPosts

Page 13: ASP.NET MVC 3 - Presentare i dati nella View

Il ViewBag permette di rendere dinamico

l’accesso ad un dizionario, il ViewData

In realtà …

Page 14: ASP.NET MVC 3 - Presentare i dati nella View

int totalPosts = 0, totalComments = 0;

using (var db = new BlogContext())

{

totalComments = db.Comments.Count();

totalPosts = (from p in db.Posts

where p.IsPublished

select p).Count();

}

ViewBag.TotalPosts = totalPosts;

ViewData[“TotalComments”] = totalComments;

ViewBag.TotalPosts

Page 15: ASP.NET MVC 3 - Presentare i dati nella View

ma vediamo come

nella vista i dati del

model si mescolano al

codice html …

Page 16: ASP.NET MVC 3 - Presentare i dati nella View

ma vediamo come

nella vista i dati del

model si mescolano al

codice html …

Page 17: ASP.NET MVC 3 - Presentare i dati nella View

Questa sintassi in esecuzione viene

interpretata da un View Engine

Page 18: ASP.NET MVC 3 - Presentare i dati nella View

Questa sintassi in esecuzione viene

interpretata da un View Engine, che

ha il compito di tradurre il codice

sottostante nell’html da inviare al

browser.

Page 19: ASP.NET MVC 3 - Presentare i dati nella View

Questa sintassi in esecuzione viene

interpretata da un View Engine, che

ha il compito di tradurre il codice

sottostante nell’html da inviare al

browser. Il View Engine in questione

si chiama Razor

Page 20: ASP.NET MVC 3 - Presentare i dati nella View

Mostriamo in home gli ultimi post:

Page 21: ASP.NET MVC 3 - Presentare i dati nella View

Mostriamo in home gli ultimi post:

1 var posts = ( from p in db.Posts

where p.IsPublished

orderby p.CreatedDate descending

select p ).Skip(0)

.Take(3)

.ToList<Post>();

Page 22: ASP.NET MVC 3 - Presentare i dati nella View

Mostriamo in home gli ultimi post:

2

var posts = ( from p in db.Posts

where p.IsPublished

orderby p.CreatedDate descending

select p ).Skip(0)

.Take(3)

.ToList<Post>();

ViewBag.Posts = posts;

Page 23: ASP.NET MVC 3 - Presentare i dati nella View

Mostriamo in home gli ultimi post:

var posts = ( from p in db.Posts

where p.IsPublished

orderby p.CreatedDate descending

select p ).Skip(0)

.Take(3)

.ToList<Post>();

ViewBag.Posts = posts;

3 @foreach (var item in (IList<Post>)ViewBag.Posts)

{

<h2>@item.Title</h2>

<h3>Pubblicato il @item.PublishedDate</h3>

<p>@item.Body</p>

<p class="tags">@item.Tags</p>

}

Page 24: ASP.NET MVC 3 - Presentare i dati nella View

Il ViewBag è molto comodo, ma ci

costringe a eseguire sempre un cast

prima di utilizzarlo se la proprietà è un

oggetto complesso

@foreach (var item in (IList<Post>)ViewBag.Posts)

{

<h2>@item.Title</h2>

<h3>Pubblicato il @item.PublishedDate</h3>

<p>@item.Body</p>

<p class="tags">@item.Tags</p>

}

Page 25: ASP.NET MVC 3 - Presentare i dati nella View

Strongly-typed views

Possiamo dire alla vista il

tipo del modello che gli

passiamo

Page 26: ASP.NET MVC 3 - Presentare i dati nella View

Strongly-typed views

public ActionResult Index() {

var posts = …;

ViewBag.Posts = posts;

return View(posts);

}

Page 27: ASP.NET MVC 3 - Presentare i dati nella View

Strongly-typed views

@using WebApp.Blog.Domain.Model;

@model IList<Post>

@foreach(var item in Model)

{

Page 28: ASP.NET MVC 3 - Presentare i dati nella View

Blocco di codice:

@ {

ViewBag.Title = "Home Page";

}

Page 29: ASP.NET MVC 3 - Presentare i dati nella View

Espressione con html encoding

<h2>@item.Title</h2>

Page 30: ASP.NET MVC 3 - Presentare i dati nella View

Espressione senza encoding

<p>@Html.Raw(item.Title)</p>

Page 31: ASP.NET MVC 3 - Presentare i dati nella View

Chiamata di un metodo

<p>@(DateTime.Now.ToLocalTime()))</p>

Page 32: ASP.NET MVC 3 - Presentare i dati nella View

Controllo del flusso

@foreach (var item in Model)

{

<h2>@item.Title</h2>

<p>@item.Body</p>

<p class="tags">@item.Tags</p>

}

Page 33: ASP.NET MVC 3 - Presentare i dati nella View

Mescolare codice e testo

@foreach (var item in Model)

{

<h2>@item.Title</h2>

<p>@item.Body</p>

<p class="tags">@item.Tags</p>

<text>Copyright - 2012</text>

}

Page 34: ASP.NET MVC 3 - Presentare i dati nella View

Selezionando le parti comuni

tra le pagine del nostro sito

possiamo definire un layout

e delle sezioni da riutilizzare

Layout

Page 35: ASP.NET MVC 3 - Presentare i dati nella View

<!DOCTYPE html>

<html>

<head><title>@ViewBag.Title</title></head>

<body>

<header>

<h1>My MVC Application</h1>

</header>

<section id="main">

@RenderBody()

</section>

<footer>@RenderSection("Footer")</footer>

</body>

</html>

Layout

Page 36: ASP.NET MVC 3 - Presentare i dati nella View

<!DOCTYPE html>

<html>

<head><title>@ViewBag.Title</title></head>

<body>

<header>

<h1>My MVC Application</h1>

</header>

<section id="main">

@RenderBody()

</section>

<footer>@RenderSection("Footer")</footer>

</body>

</html>

Layout

Page 37: ASP.NET MVC 3 - Presentare i dati nella View

<!DOCTYPE html>

<html>

<head><title>@ViewBag.Title</title></head>

<body>

<header>

<h1>My MVC Application</h1>

</header>

<section id="main">

@RenderBody()

</section>

<footer>@RenderSection("Footer")</footer>

</body>

</html>

Layout

Page 38: ASP.NET MVC 3 - Presentare i dati nella View

Come faccio a fare in modo che la

vista utilizzi un determinato layout?

Layout

@{

ViewBag.Title = "Home Page";

Layout = "~/Views/Shared/_Layout.cshtml";

}

Page 39: ASP.NET MVC 3 - Presentare i dati nella View

Ma lo devo fare per ogni vista?!

Layout

Page 40: ASP.NET MVC 3 - Presentare i dati nella View

Ma lo devo fare per ogni vista?!

NO, basta utilizzare il ViewStart …

Layout

Page 41: ASP.NET MVC 3 - Presentare i dati nella View

E’ un file che viene inserito nella

cartella principale e permette di far

applicare delle regole a tutte le

viste presenti in quella cartella e in

tutte le sue sottocartelle

_ViewStart

Page 42: ASP.NET MVC 3 - Presentare i dati nella View

Se le informazioni da visualizzare

sono le stesse (o quasi) per molte

pagine, allora possiamo creare una

“vista parziale” che le contenga

PartialView

Page 43: ASP.NET MVC 3 - Presentare i dati nella View

<footer>@Html.Partial("Footer")</footer>

PartialView

Nel layout o nella view

<p>Copyright © 2012</p>

In un file con nome Footer.cshtml (sotto la cartella ~/Shared )

Page 44: ASP.NET MVC 3 - Presentare i dati nella View

Se non mi basta la vista parziale

posso ricorrere alle “child action”

RenderAction

Page 45: ASP.NET MVC 3 - Presentare i dati nella View

RenderAction @{ Html.RenderAction("List", "Category"); }

All’interno

di una vista

1

Page 46: ASP.NET MVC 3 - Presentare i dati nella View

RenderAction

2 public ActionResult List()

{

IList<Category> cat_s = new List<Category>();

using (var db = new BlogContext())

{

cat_s = (from c in db.Categories.Include("Posts")

select c).ToList<Category>();

}

return PartialView(categories);

}

Come action di

un controller

Page 47: ASP.NET MVC 3 - Presentare i dati nella View

RenderAction

3 @using WebApp.Blog.Domain.Model;

@model ICollection<Category>

<h2>Categorie</h2>

<ul>

@foreach (var item in Model)

{

<li>

@item.Name

(@(item.Posts != null ? item.Posts.Count() : 0))

</li>

}

</ul>

Codice di markup

della partialview

Page 48: ASP.NET MVC 3 - Presentare i dati nella View

Una pagina che visualizzi tutti i

post di una categoria

Una pagina che mostri i dati di un

post compresi i commenti

Paginare l’home page per

mostrare i post meno recenti

Come esercizio:

Page 49: ASP.NET MVC 3 - Presentare i dati nella View

continua …

Page 50: ASP.NET MVC 3 - Presentare i dati nella View

Slide 10: http://www.flickr.com/photos/jeffwerner/2677245039/in/photostream/

Slide 13: http://www.flickr.com/photos/philthomas/3345060816/in/photostream/

Credits Le immagini contenute in questa presentazione

hanno licenza Creative Commons

Page 51: ASP.NET MVC 3 - Presentare i dati nella View

Thank You

MANUEL SCAPOLAN website: www.manuelscapolan.it twitter: manuelscapolan e-mail: [email protected]