ASP.NET MVC 3<br />Benedetti Stefano<br />
Contatti<br />Ing. Stefano Benedetti<br />http://www.be-st.it<br />http://blog.be-st.it<br />info@be-st.it <br />Lo User G...
Agenda<br />MVC Overview<br />scaffolding<br />supporto HTML 5<br />viewengineRazor<br />miglioramenti sui controller<br /...
MVC Overview<br />Pattern di presentazione<br />
MVC Overview<br />Originariamente impiegato dal linguaggio Smalltalk<br />Smalltalk è stato sviluppato allo Xerox PARC dur...
Vantaggi<br />SeparationofConcerns (SoC)<br />UnitTesting<br />DI<br />Nessun viewstate<br />Controllo completo dell’HTML<...
ASP.NETPage life cycle<br />
MVC Routing<br />Disaccoppiamento tra URL e pagina fisica<br />/products<br />/products/detail/1<br />/products/edit/1<br ...
Global.asx e MapRoute<br /> public staticvoidRegisterRoutes(RouteCollectionroutes)<br /> {<br />routes.MapRoute(<br />    ...
MVC Routing<br />www.sito/product<br />public classProductController : Controller<br />{<br />public ViewResultIndex()<br ...
MVC Routing<br />products/details/1<br />public classProductController : Controller<br />{<br /> public ViewResultDetails(...
MVC Routing<br />GET: /Product/Edit/5<br />public ActionResultEdit(intid)<br />        {<br />Productproduct = db.Products...
MVC Routing e ModelBinding<br />POST: /Product/Edit/5<br />[HttpPost]<br />public ActionResultEdit(Productproduct)<br />  ...
Requisiti<br />Per il runtimeASP.NET MVC 3:<br />	.NET Framework version4<br />ASP.NETMVC 3 Visual Studio 2010 tools:<br /...
Installazione<br />Side by side con MVC 2<br />Web PlatformInstaller (WebPI)<br />http://www.microsoft.com/web/gallery/ins...
NuGet<br />Library Package Manager<br />Estensione di Visual Studio<br />Automazione:<br />Download<br />Package folder<br...
NuGet<br />DEMO<br />
NuGet in MVC 3<br />Versione 1.2<br />Package pre-installati<br />Modernizr<br />Entity Framework Code First<br />JQuery<b...
Scaffolding<br />Creazione dell’impalcatura<br />“Add Controller” ha 3 modalità di scaffolding:<br />Empty controller<br /...
Scaffolding<br />Controller withread/writeactions and view, usingEntity Framework<br /><ul><li>Benefici</li></ul>Accesso a...
Scaffolding<br />Alternativa: MVCScaffolding<br />Package NuGet<br />http://blog.stevensanderson.com<br />Pro ASP.NET MVC ...
HTML 5<br />I template di progetto supportano HTML 5<br />
HTML 5<br />Nuovi tag<br />Header<br />Footer<br />Nav<br />Section<br />Validazione HTML 5 in VS 2010<br />
HTML 5<br />La compatibilità  con i browser più vecchi è garantita da Modernizr<br />Browser non HTML 5<br /><header><br /...
Package NuGet</li></li></ul><li>ViewEngine “Razor”<br />Overview<br />Nuove feature<br />Nuovi HTML helpers<br />
ViewEngine “Razor”<br />Concisa<br />Facile da imparare<br />Intellisense e evidenziazione del codice Razor in Visual Stud...
ViewEngine “Razor”<br />Definizione del model: @model<br />Commenti: @* *@<br />Impostazioni di default (ad es. layoutpage...
Razor Layout<br />
ViewEngineSupport<br />Default<br />Web Forms (ASPX)<br />Razor<br />Spark<br />NHaml<br />NDJango<br />
Nuovi HTML Helpers<br />Chart<br />WebGrid<br />Crypto<br />WebImage<br />WebMail<br />
Chart<br />DemoHtmlHelpersController<br /> public ActionResult Chart()<br />        {<br />var key = new Chart(width: 600,...
Chart<br />View<br /><p><br />    <imgsrc="/DemoHtmlHelpers/Chart" alt="Chart" /><br /></p><br />
WebGrid<br /> @{<br />vargrid = newWebGrid(source: Model, rowsPerPage: 3);<br />}<br />@grid.GetHtml(tableStyle: "grid",<b...
WebGrid<br />Layout<br />Sort<br />Paginazione<br />
WebImage<br />varimagePath = Server.MapPath("~/images/dotdotnet.png");<br />varimage = newWebImage(imagePath);<br />FlipVe...
Miglioramenti ai controller<br />Global ActionFilters<br />Nuova ViewBagproperty<br />Nuovi ActionResult<br />
Global ActionFilters<br />MVC 2: ActionFilters<br />Codice da eseguire prima e dopo una SPECIFICA action<br />Si applica s...
Global ActionFilters<br />MVC 3: Global ActionFilters<br />Filtri da eseguire prima e dopo OGNI action di tutti i controll...
ViewBag<br />MVC 2: ViewData<br />Dictionary<br />MVC 3: ViewBag<br />DynamicProperty<br />ViewData[“Message”] VS. ViewBag...
Nuovi ActionResult<br />HttpNotFoundResult<br />RedirectResult<br />HttpStatusCodeResult<br />Demo<br />
Javascript e AJAX<br />AJAX sfrutta NuGet (aggiornabile)<br />UnobtrusiveJavaScript<br />Default Client-Side Validation<br...
UnobtrusiveJavaScript<br />Vantaggi<br />Separazione tra codice e markup<br />Performance e scalabilità<br />Aggiornamento...
Separazione tra codice e markup<br /><input type="text" name="date" onchange="validateDate()" /><br /><input type="text" n...
UnobtrusiveJavaScript – ON/OFF<br />Web.Config – appSettings<br />    <add key="UnobtrusiveJavaScriptEnabled" value="true"...
Unobtrusive JS: Performance<br />OFF<br /><form<br />    action="/ajax/callback"<br />    id="form0"<br />    method="post...
Default Client-Side Validation<br />MVC 2<br />Html.EnableClientValidation<br />MVC 3<br />Default!<br />Disabilitabile da...
Remote Validator<br />RemoteAttribute<br />JQueryValidation<br />Demo<br />
JSON Binding<br />Il modelbinding è stato esteso per supportare JSON<br />E’ possibile fare binding da un oggetto JSON ad ...
JSON Binding<br />
JSON Binding<br />
ModelValidation<br />DataAnnotations<br />ValidationAttribute<br />ValidationInterfaces<br />
DataAnnotations<br />Supporto diretto ai DataAnnotations<br />DisplayAttribute<br />
ValidationAttribute<br />IsValidOverload<br />Accesso all’oggetto in corso di validazione<br />CompareAttribute<br />
ValidationInterfaces<br />IValidatableObject <br />Validazione a livello di model<br />Stato del model<br />Confronto tra ...
ValidationInterfaces<br />
DependencyInjection<br />Cos’è<br />Le dipendenze non sono all’interno del componente<br />Le dipendenze vengono iniettate...
Nessuna injection<br />public classOrderManager<br />    {<br />        public voidProcessOrder()<br />        {<br />varl...
DI: constructorinjection<br />public classOrderManagerDI<br />    {<br />        private readonlyILog_logger;<br />       ...
DI in pratica = IOC<br />Le dipendenze possono essere moltissime ed in cascata<br />La risoluzione delle dipendenze viene ...
DependencyInjection<br />Controllers<br />Views<br />ActionFilters<br />ModelBinders<br />Modelvalidation<br />Modelmetada...
Altre nuove features<br />Partial-page output caching<br />Estendibilità della finestra “New Project”<br />OverloadsHtml.L...
ASP.NET è morto?<br />NO!<br />
ASP.NET è morto?<br />Intranet/web application “non pubbliche”<br />Molto veloce sviluppare<br />Infinità di controlli ser...
Riferimenti<br />MVC Page su ASP.NET<br />www.asp.net/mvc<br />MSDN<br />go.microsoft.com/fwlink/?LinkId=205717<br />Scott...
Riferimenti<br />NuGet<br />http://nuget.codeplex.com/<br />http://haacked.com/tags/NuGet/default.aspx<br />http://blog.be...
That’s allfolks<br />Grazie<br />
Upcoming SlideShare
Loading in …5
×

Asp.Net MVC 3 - Il Model View Controller secondo Microsoft

2,955 views

Published on

Il pattern architetturale MVC (Model View Controller) favorisce la manutenzione delle applicazioni web tramite una architettura elegante ed una chiara ed esplicita separazione delle competenze, l'impiego dei più diffusi pattern di software engineering, il controllo completo dell'HTML generato e degli URL, la testabilità ed estendibilità.

In questa sessione vedremo le novità principali di Asp.Net MVC in versione 3.

La sessione è stata tenuta a SMAU Business Bologna il 9 giugno 2011

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,955
On SlideShare
0
From Embeds
0
Number of Embeds
116
Actions
Shares
0
Downloads
76
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Asp.Net MVC 3 - Il Model View Controller secondo Microsoft

  1. 1. ASP.NET MVC 3<br />Benedetti Stefano<br />
  2. 2. Contatti<br />Ing. Stefano Benedetti<br />http://www.be-st.it<br />http://blog.be-st.it<br />info@be-st.it <br />Lo User Group dell'Emilia-Romagnainteramente dedicato alle tecnologie Microsoft .NET<br />http://dotdotnet.org/<br />
  3. 3. Agenda<br />MVC Overview<br />scaffolding<br />supporto HTML 5<br />viewengineRazor<br />miglioramenti sui controller<br />nuove funzionalità Javascript e AJAX<br />integrazione con NuGet<br />miglior supporto alla DependencyInjection<br />altre features<br />
  4. 4. MVC Overview<br />Pattern di presentazione<br />
  5. 5. MVC Overview<br />Originariamente impiegato dal linguaggio Smalltalk<br />Smalltalk è stato sviluppato allo Xerox PARC durante gli anni settanta<br />
  6. 6. Vantaggi<br />SeparationofConcerns (SoC)<br />UnitTesting<br />DI<br />Nessun viewstate<br />Controllo completo dell’HTML<br />Scomparsi i controlli server e gli ID autogenerati<br />No PageLifeCycle<br />Performance<br />Semplicità<br />
  7. 7. ASP.NETPage life cycle<br />
  8. 8. MVC Routing<br />Disaccoppiamento tra URL e pagina fisica<br />/products<br />/products/detail/1<br />/products/edit/1<br />/products/delete/1<br />Get<br />Post<br />Configurabile tramite Global.asax<br />Convention overconfiguration<br />ProductsController<br />
  9. 9. Global.asx e MapRoute<br /> public staticvoidRegisterRoutes(RouteCollectionroutes)<br /> {<br />routes.MapRoute(<br /> "Default", // Routename<br /> "{controller}/{action}/{id}", // URL with parameters<br />new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameterdefaults<br /> );<br /> }<br />
  10. 10. MVC Routing<br />www.sito/product<br />public classProductController : Controller<br />{<br />public ViewResultIndex()<br /> {varproducts = db.Products.Include(p => p.Brand);<br />returnView(products.ToList());<br /> }<br />}<br />Default Action (Index)<br />
  11. 11. MVC Routing<br />products/details/1<br />public classProductController : Controller<br />{<br /> public ViewResultDetails(intid)<br /> {<br />Productproduct = db.Products.Find(id);<br />returnView(product);<br /> }<br />}<br />
  12. 12. MVC Routing<br />GET: /Product/Edit/5<br />public ActionResultEdit(intid)<br /> {<br />Productproduct = db.Products.Find(id);<br />ViewBag.BrandId = new SelectList(db.Brands, "Id", "Name", product.BrandId);<br />returnView(product);<br /> }<br />
  13. 13. MVC Routing e ModelBinding<br />POST: /Product/Edit/5<br />[HttpPost]<br />public ActionResultEdit(Productproduct)<br /> {<br />if (ModelState.IsValid)<br /> {<br />db.Entry(product).State = EntityState.Modified;<br />db.SaveChanges();<br />returnRedirectToAction("Index");<br /> }<br />ViewBag.BrandId = new SelectList(db.Brands, "Id", "Name", product.BrandId);<br />returnView(product);<br /> }<br />
  14. 14. Requisiti<br />Per il runtimeASP.NET MVC 3:<br /> .NET Framework version4<br />ASP.NETMVC 3 Visual Studio 2010 tools:<br />VisualStudio 2010 o Visual Web Developer 2010 Express<br />
  15. 15. Installazione<br />Side by side con MVC 2<br />Web PlatformInstaller (WebPI)<br />http://www.microsoft.com/web/gallery/install.aspx?appid=MVC3<br />Download diretto<br />http://go.microsoft.com/fwlink/?LinkID=208140<br />
  16. 16. NuGet<br />Library Package Manager<br />Estensione di Visual Studio<br />Automazione:<br />Download<br />Package folder<br />Reference<br />Web.config<br />Configurazione custom<br />Gestione update<br />Post e guida di base su blog.be-st.it<br />
  17. 17. NuGet<br />DEMO<br />
  18. 18. NuGet in MVC 3<br />Versione 1.2<br />Package pre-installati<br />Modernizr<br />Entity Framework Code First<br />JQuery<br />
  19. 19. Scaffolding<br />Creazione dell’impalcatura<br />“Add Controller” ha 3 modalità di scaffolding:<br />Empty controller<br />Controller withemptyread/writeactions<br />Controller withread/writeactions and view, usingEntity Framework<br />
  20. 20. Scaffolding<br />Controller withread/writeactions and view, usingEntity Framework<br /><ul><li>Benefici</li></ul>Accesso ai dati<br />Validazione<br />One-to-manyrelationship<br />
  21. 21. Scaffolding<br />Alternativa: MVCScaffolding<br />Package NuGet<br />http://blog.stevensanderson.com<br />Pro ASP.NET MVC V2 Framework<br />
  22. 22. HTML 5<br />I template di progetto supportano HTML 5<br />
  23. 23. HTML 5<br />Nuovi tag<br />Header<br />Footer<br />Nav<br />Section<br />Validazione HTML 5 in VS 2010<br />
  24. 24. HTML 5<br />La compatibilità con i browser più vecchi è garantita da Modernizr<br />Browser non HTML 5<br /><header><br /><nav><br /><section><br /><footer><br /><ul><li>http://www.modernizr.com/
  25. 25. Package NuGet</li></li></ul><li>ViewEngine “Razor”<br />Overview<br />Nuove feature<br />Nuovi HTML helpers<br />
  26. 26. ViewEngine “Razor”<br />Concisa<br />Facile da imparare<br />Intellisense e evidenziazione del codice Razor in Visual Studio<br />
  27. 27. ViewEngine “Razor”<br />Definizione del model: @model<br />Commenti: @* *@<br />Impostazioni di default (ad es. layoutpage)<br />Html senza encoding: Html.Raw<br />Codice condiviso tra le view (_viewstart.cshtml)<br />“Master page”: layout<br />
  28. 28. Razor Layout<br />
  29. 29. ViewEngineSupport<br />Default<br />Web Forms (ASPX)<br />Razor<br />Spark<br />NHaml<br />NDJango<br />
  30. 30. Nuovi HTML Helpers<br />Chart<br />WebGrid<br />Crypto<br />WebImage<br />WebMail<br />
  31. 31. Chart<br />DemoHtmlHelpersController<br /> public ActionResult Chart()<br /> {<br />var key = new Chart(width: 600, height: 400)<br /> .AddSeries(<br />chartType: "bar",<br />legend: "Rainfall",<br />xValue: new[] { "Jan", "Feb", "Mar", "Apr", "May" },<br />yValues: new[] { "20", "20", "40", "10", "10" })<br /> .Write();<br />returnnull;<br /> }<br />
  32. 32. Chart<br />View<br /><p><br /> <imgsrc="/DemoHtmlHelpers/Chart" alt="Chart" /><br /></p><br />
  33. 33. WebGrid<br /> @{<br />vargrid = newWebGrid(source: Model, rowsPerPage: 3);<br />}<br />@grid.GetHtml(tableStyle: "grid",<br />headerStyle: "head",<br />alternatingRowStyle: "alt",<br />columns: grid.Columns(<br />grid.Column("Id"),<br />grid.Column("Name")<br /> )<br /> )<br /><tableclass="grid"><br /><thead><trclass="head"><br /><trclass="alt"><br />
  34. 34. WebGrid<br />Layout<br />Sort<br />Paginazione<br />
  35. 35. WebImage<br />varimagePath = Server.MapPath("~/images/dotdotnet.png");<br />varimage = newWebImage(imagePath);<br />FlipVertical(); FlipHorizontal();<br />RotateLeft(); RotateRight();<br />Crop<br />WaterMark<br />Resize<br />Formato immagine: JPEG, PNG (default), BMP, GIF<br />
  36. 36. Miglioramenti ai controller<br />Global ActionFilters<br />Nuova ViewBagproperty<br />Nuovi ActionResult<br />
  37. 37. Global ActionFilters<br />MVC 2: ActionFilters<br />Codice da eseguire prima e dopo una SPECIFICA action<br />Si applica sull’action o sul controller<br />
  38. 38. Global ActionFilters<br />MVC 3: Global ActionFilters<br />Filtri da eseguire prima e dopo OGNI action di tutti i controller<br />GlobalFilters<br />
  39. 39. ViewBag<br />MVC 2: ViewData<br />Dictionary<br />MVC 3: ViewBag<br />DynamicProperty<br />ViewData[“Message”] VS. ViewBag.Message<br />
  40. 40. Nuovi ActionResult<br />HttpNotFoundResult<br />RedirectResult<br />HttpStatusCodeResult<br />Demo<br />
  41. 41. Javascript e AJAX<br />AJAX sfrutta NuGet (aggiornabile)<br />UnobtrusiveJavaScript<br />Default Client-Side Validation<br />Remote validator<br />Supporto al binding JSON<br />
  42. 42. UnobtrusiveJavaScript<br />Vantaggi<br />Separazione tra codice e markup<br />Performance e scalabilità<br />Aggiornamento delle librerie per supportare nuove funzionalità/nuovi e vecchi useragent<br />Svantaggi<br />Sviluppo più lento<br />Necessità di cercare eventuali JS associati ai tag<br />
  43. 43. Separazione tra codice e markup<br /><input type="text" name="date" onchange="validateDate()" /><br /><input type="text" name="date" id="date" /><br />$(function(){ $('#date').bind('change', validateDate); });<br />
  44. 44. UnobtrusiveJavaScript – ON/OFF<br />Web.Config – appSettings<br />    <add key="UnobtrusiveJavaScriptEnabled" value="true"/><br />HtmlHelper.UnobtrusiveJavaScriptEnabled<br />Default: ON (sui nuovi progetti)<br />OFF: compatibilità con MVC 1 e 2<br />Utilizza attributi compatibili con HTML 5<br />
  45. 45. Unobtrusive JS: Performance<br />OFF<br /><form<br />    action="/ajax/callback"<br />    id="form0"<br />    method="post"<br />    onclick="Sys.Mvc.AsyncForm.handleClick(this, newSys.UI.DomEvent(event));"<br />    onsubmit="Sys.Mvc.AsyncForm.handleSubmit(this, newSys.UI.DomEvent(event), { insertionMode: Sys.Mvc.InsertionMode.replace, loadingElementId: 'loading', updateTargetId: 'updateme' });"><br />ON<br /><form<br />    action="/ajax/callback"<br />    data-ajax="true"<br />    data-ajax-loading="#loading"<br />    data-ajax-mode="replace"<br />    data-ajax-update="#updateme"<br />    method="post"><br />
  46. 46. Default Client-Side Validation<br />MVC 2<br />Html.EnableClientValidation<br />MVC 3<br />Default!<br />Disabilitabile da web.config<br />
  47. 47. Remote Validator<br />RemoteAttribute<br />JQueryValidation<br />Demo<br />
  48. 48. JSON Binding<br />Il modelbinding è stato esteso per supportare JSON<br />E’ possibile fare binding da un oggetto JSON ad un parametro di una action<br />
  49. 49. JSON Binding<br />
  50. 50. JSON Binding<br />
  51. 51. ModelValidation<br />DataAnnotations<br />ValidationAttribute<br />ValidationInterfaces<br />
  52. 52. DataAnnotations<br />Supporto diretto ai DataAnnotations<br />DisplayAttribute<br />
  53. 53. ValidationAttribute<br />IsValidOverload<br />Accesso all’oggetto in corso di validazione<br />CompareAttribute<br />
  54. 54. ValidationInterfaces<br />IValidatableObject <br />Validazione a livello di model<br />Stato del model<br />Confronto tra proprietà del model<br />
  55. 55. ValidationInterfaces<br />
  56. 56. DependencyInjection<br />Cos’è<br />Le dipendenze non sono all’interno del componente<br />Le dipendenze vengono iniettate<br />
  57. 57. Nessuna injection<br />public classOrderManager<br /> {<br /> public voidProcessOrder()<br /> {<br />varlogger = newLogManager();<br />logger.Log();<br /> }<br /> }<br />
  58. 58. DI: constructorinjection<br />public classOrderManagerDI<br /> {<br /> private readonlyILog_logger;<br /> public OrderManagerDI(ILoglogger)<br /> {<br />_logger = logger;<br /> }<br /> public voidProcessOrder()<br /> {<br />_logger.Log();<br /> }<br /> }<br />
  59. 59. DI in pratica = IOC<br />Le dipendenze possono essere moltissime ed in cascata<br />La risoluzione delle dipendenze viene demandata ad un gestore esterno<br />L’IOC si occupa di gestire le dipendenze a runtime<br />Esempio:<br />Ninject<br />
  60. 60. DependencyInjection<br />Controllers<br />Views<br />ActionFilters<br />ModelBinders<br />Modelvalidation<br />Modelmetadata<br />Valueproviders<br />
  61. 61. Altre nuove features<br />Partial-page output caching<br />Estendibilità della finestra “New Project”<br />OverloadsHtml.LabelFor e Html.LabelForModel<br />Supporto alla sessione nei controller<br />AdditionalMetadataAttribute<br />Nuovo AccountController<br />Nuovo template di progetto “Intranet”<br />
  62. 62. ASP.NET è morto?<br />NO!<br />
  63. 63. ASP.NET è morto?<br />Intranet/web application “non pubbliche”<br />Molto veloce sviluppare<br />Infinità di controlli server sul mercato<br />ASP.NET 4.0 sopperisce a molti limiti sul controllo dell’HTML<br />
  64. 64. Riferimenti<br />MVC Page su ASP.NET<br />www.asp.net/mvc<br />MSDN<br />go.microsoft.com/fwlink/?LinkId=205717<br />ScottGu<br />http://weblogs.asp.net/scottgu/<br />
  65. 65. Riferimenti<br />NuGet<br />http://nuget.codeplex.com/<br />http://haacked.com/tags/NuGet/default.aspx<br />http://blog.be-st.it/?tag=/nuget<br />
  66. 66. That’s allfolks<br />Grazie<br />

×