Asp.NET MVC è un nuovo framework per lo sviluppo di applicazioni web alternativo al modello webform. Questo consente di utilizzare il pattern MVC per lo sviluppo di applicazioni Asp.NET, permettendo quindi una miglior separazione delle responsabilità che a sua volta porta ad una maggior manutenibilità, riusabilità e facilità nel testing.
La sessione illustrerà i motivi che hanno portato alla nascita di Asp.NET MVC e le sue caratteristiche fondamentali.
Agenda:
- Storia dei framework MS per lo sviluppo web
- Introduzione a Asp.NET MVC
- Vantaggi di Asp.NET MVC
- Il pattern MVC
- Hello MVC: DEMO
- Componenti di MVC: Routing, Controller, Model, View
2. Agenda
► Storia degli strumenti Microsoft per lo
sviluppo Web
► Introduzione ad ASP.NET MVC
► Pattern MVC
► ASP.NET MVC nel dettaglio
► Futuro di ASP.NET MVC
1
5. Prima c’era ASP “Classic” - Storia
ASP (‘96 – 2000, IIS3 –> )
– Primo framework di sviluppo web integrato col
webserver
– Introduce le prime astrazioni per facilitare
l’interazione con il webserver
– Request
– Response
– Server
4
6. Prima c’era ASP “Classic” - Problemi
► Lascia completa libertà al programmatore =
– Codice e HTML sono mischiati (“spaghetti code”)
► Difficile separare implementazione e presentazione
5
<% Set oConn = Server.CreateObject("ADODB.Connection")
oConn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" &
Server.MapPath("DB.mdb")
Set rsUsers = Server.CreateObject("ADODB.Recordset")
rsUsers.Open "SELECT * FROM Users", oConn %>
<TABLE align="center" border="0" cellpadding="0" cellspacing="0"
width="100%">
<% do while not rsUsers.eof %>
<tr>
<td><%=rsUsers.fields(0)%></td>
<td><%=rsUsers.fields(2)%></td>
</tr>
<% rs.movenext
loop %>
</table>
<% rsUsers = Nothing
oConn = Nothing %>
7. Poi venne ASP.NET - Storia
► Cerca di risolvere il problema dello
“spaghetti code”
► Rilasciato Gen ‘02 con .NET 1.0
► Permette di adottare un approccio VB6-like
per lo sviluppo web.
► Nasce il concetto di
WebForm
6
9. Poi venne ASP.NET - WebForm
► Ciclo di vita della pagina basato su eventi
► Programmazione basata su eventi
► UserControls e Control tree
► Nasconde la natura state-less delle web
application introducendo la gestione dello
stato
– Postback
– Session
– Application
– ViewState
8
10. Poi venne ASP.NET - Caratteristiche
► HTML e codice sono in due file distinti
(code-behind):
– .aspx: contiene HTML e webcontrols
– .aspx.cs: contiene il codice per manipolare i
webcontrols
9
<html
xmlns="http://www.w3.org/1999/xht
ml" >
<head runat="server“
<title>Sample page</title>
</head> <body>
<form id="form1" runat="server">
<div>
<asp:Label runat="server"
id="Label1" /> </div>
</form>
</body>
</html>
using System;
namespace Website
{
public partial class Page1 :
System.Web.UI.Page
{
protected Label Label1;
protected void Page_Load
(object sender, EventArgs e)
{
Label1.Text = "Hello ASP.NET";
}
}
}
15. Poi venne ASP.NET – Soluzione ai Problemi
► Codice troppo accoppiato: pattern MVP, WCSF,
MonoRail
► HTML “brutto”: CSS Adapter Toolkit, templated
controls
► ViewState “ingombrante”: abilitarlo
selettivamente
14
Ma tutto ciò non è “out-of-the-box”
18. ASP.NET MVC to the rescue – Storia
► Nasce per cercare di risolvere i problemi di
ASP.NET
► Annunciato da Scott Guthrie alla prima
ALT.NET conference di Austin a Ott ‘07
► Attualmente alla versione Preview3 (Giugno
‘08)
► “Obbliga” una maggior separazione delle
responsabilità
17
19. ASP.NET MVC – Caratteristiche
► Implementa il pattern Model-View-Controller
► Sviluppato per essere testabile
► Estendibile
► URL mapping engine
► Utilizza il modello webform per quel che
riguarda il rendering, ma non per il postback
► Supporta tutte le funzionalità pre-esistenti:
autenticazione, autorizzazione, caching,
session, providers, ecc…
18
21. MVC in Real Life
► Consegna della pizza
► L’utente parla al controller (prende l’ordine
per la pizza)
22. MVC in Real Life
► Il controller delega al model (il cuoco
riceve l’ordine)
23. MVC in Real Life
► Quando la pizza è pronta, viene data al
controller che delega alla view
(fattorino porta la pizza a casa)
24. Introduzione a MVC
► Introdotto per la prima volta in Smalltalk
nel ‘79
► “Di moda” negli ultimi anni grazie a Struts,
Spring MVC e Ruby on Rails
► Divide l’applicazione in 3 componenti:
– Model: la business logic dell’applicazione, che
contiene le informazioni sui dati
– View: rappresenta i dati nella UI visibile
dall’utente
– Controller: orchestra le operazioni, riceve l’input,
decide come recuperare i dati e li passa alla view
23
25. Il flusso di un’applicazione MVC
24
Model
View
Controller
1
5
2
4
3
B
r
o
w
s
e
r
La richiesta
arriva al
controller
Il Controller
chiede i dati
al Model
Il Model
restituisce i dati
al controller
Il controller
formatta i dati e li
passa alla view
La view costriusce
la pagina che viene
inivata al browser
28. Routing
► Parte di ASP.NET 3.5 SP1
– System.Web.Routing.dll
► Url con parametri:
– {controller}, {action}, {parametri}
27
routes.MapRoute(
"Blog", //nome
"blog/{date}/{title}", //url
/*valori di default per i parametri*/
new {
controller = "Blog", //Controller
action = "Show", //Action
date = DateTime.Now, //Parametri
title = ""
}
);
29. Controller
► Classe con nome <NomeController>Controller
► Eredita da Controller
► Un metodo pubblico per Action
► Metodo restituisce ActionResult
28
public class BlogController : Controller
{
public ActionResult Show(DateTime date, string title)
{
ViewData["Titolo"] = title;
ViewData["Data"] = date;
return View();
//return View(“<viewName>", <viewdata>);
}
}
30. View – Loosely Typed
► E’ un normale WebForm che eredita da ViewPage
► DEVE SOLO costruire la UI HTML
► ViewData è +/- una HashTable
29
public partial class Show : ViewPage
{
//quasi sempre vuoto
}
<h2><%= Html.Encode(ViewData["Message"]) %></h2>
<%= ((DateTime)ViewData["Data"]).ToLongDateString()%>
31. View – Strongly Typed
► La view può anche essere strongly typed
– Complie time check
– Intellisense friendly
► ViewData è una classe custom
30
public partial class StrongShow : ViewPage<PresentationModelClass>
{
//quasi sempre vuoto
}
<h2><%= Html.Encode(ViewData.Model.Message) %></h2>
<%= ViewData.Model.Data.ToLongDateString()%>
32. View – UI Helpers
► UI Helper per aiutare la scrittura di codice
HTML
– Html.ActionLink
– Html.ActionLink<ControllerClass>
– Html.Form
– Html.Form<ControllerClass>
31
Html.ActionLink(“Testo Link",“ActionName",“Controller", new {
parametri });
Html.ActionLink<ControllerClass>( c => c.ActionName(parametri),"
Testo Link");
33. Estendere MVC
► Tutto può essere esteso
– IControllerFactory
– StructureMapControllerFactory
– UnityControllerFactory
– SpringControllerFactory
– …
– IViewFactory
– BooViewEngine
– NHamlViewFactory
– …
► Quasi tutte le integazioni sono sviluppate
all’interno di MVCContrib:
http://www.codeplex.com/MVCContrib
32
35. ASP.NET MVC vs WebForms
► WebForms
– Sviluppo RAD
– Paradigma più simile allo sviluppo tradizionale
client-side
– Ottimo per “prototipare”
– Può diventare inmantenibile
► ASP.NET MVC
– Più codice da scrivere
– “Miglior” architettura dell’applicazione
– Maggior controllo su HTML
– Abilita uso di metodologie Agile
34
36. Stato di ASP.NET MVC
► Ora siamo alla Preview 3
► Routing ormai “stabile” (parte di ASP.NET 3.5
SP1)
► Nelle prossime Preview verranno indirizzati i
seguenti problemi:
– Integrazione “nativa” di Ajax
– Controlli con logica applicativa
35
37. Conclusioni
► ASP.NET MVC è un framework che ci permette di
scrivere buon software by default
► ASP.NET WebForm necessita di “lavoro” per
raggiungere lo stesso livello di pulizia
► ASP.NET MVC non è ASP.NET 4.0
– è un’alternativa, non un sostituto
36
38. Risorse
► http://asp.net/mvc/ - Sito ufficiale, con
download P3
► http://www.codeplex.com/aspnet - Codice
sorgente
► http://del.icio.us/tag/aspnetmvc - tutti gli
articoli su ASP.NET MVC
► http://polymorphicpodcast.com/shows/mvcresour
ces/ - lista “commentata” di risorse
► Blog di MS
– ScottGu: http://weblogs.asp.net/scottgu/default.aspx
– ScottHa: http://www.hanselman.com/blog/
– PhilHa: http://haacked.com/
37