Sviluppo Web

AspNet MVC - L'evoluzione di AspNet MVC

Asp.Net MVC agli inizi è stato un framework sottovalutato dagli sviluppatori Asp.Net che, spaventati dal radicale cambiamento di approccio allo sviluppo, lo hanno quasi subito cestinato come possibile alternativa a Web Forms. Oggi la situazione è totalmente cambiata grazie all'evoluzione che hanno avuto il framework e i tool a supporto.

I principali sforzi fatti nelle versioni successive alla prima del framework MVC sono stati sempre orientati al miglioramento della produttività nella scrittura dei vari elementi che vanno a comporre l’applicazione, con particolare attenzione alle view. Il grosso delle migliorie sono state sicuramente introdotte nella seconda versione, mentre la terza vanta tutta una serie di caratteristiche che lo rendono un prodotto più maturo e flessibile. La versione 4 introdusse invece gli strumenti necessari allo sviluppo di applicazioni web moderne, che tengano conto dei diversi dispositivi e browser su cui le applicazioni web devono essere consumate. 

Purtroppo senza una buona conoscenza del framework è impossibile rendere al meglio il lavoro fatto in queste versioni. Cercheremo comunque a grandi linee di dare l’idea di come il framework si sia evoluto, lasciando agli articoli successivi gli approfondimenti sui singoli punti.

 

Uso di View Engine differenti

Come già detto parlando di Razor, MVC 3 e 4 hanno introdotto la possibilità di utilizzare View Engine diversi dal classico Aspx. E’ possibile quindi decidere con quale sintassi andare a dichiarare nelle view la parte di codice che si occupa della generazione dinamica del codice html da restituire all’utente. Razor ne è un esempio evidente, ma è possibile utilizzare anche view engine open source come Spark, nHaml o NDjango. Con MVC 4 fu anche rilasciata una seconda release di Razor, denominata Razor 2, che introdusse molte semplificazioni alla sintassi della precedente versione.

Miglioramenti ai controller

Come vedremo meglio nell'articolo dedicato ai controller, una delle caratteristiche più interessanti di Asp.Net MVC è l’estendibilità del framework, che fornisce vari punti in cui possiamo andare a personalizzare i comportamenti. Come abbiamo visto gli action methods, i metodi dei controller che gestiscono le richieste, possono avere come tipo di ritorno la classe astratta ActionResult, che possiamo andare a estendere per implementare le nostre tipologie di risultati. Con il framework MVC 3 ci sono stati regalati tre ActionResult molto utili:

HttpNotFoundResult, che restituisce un classico http status code 404 al client, indicando quindi una risorsa non trovata o non disponibile.
RedirectResult, che, in base ad un parametro booleano, restituisce al client un redirect provvisorio o permanente, quindi i classici http status code 302 e 301.
HttpStatusCodeResult, che ci permette di scegliere quale status code http restituire al client.

Un altro punto di estendibilità molto comodo del framework è la possibilità di implementare dei filtri applicabili prima e dopo una richiesta, per andare a influenzarne il comportamento. Stiamo parlando di quelli che nel framework sono definiti Action Filters, fisicamente degli attributi da applicare agli action methods, che possiamo facilmente realizzare estendendo la classe base astratta FilterAttribute. Il framework ci fornisce quelli di comune utilità, uno dei più famosi è sicuramente Authorize, che approfondiremo nell'articolo sull’autenticazione e la protezione e che ci permette di indicare che l’invocazione di un certo action method è riservata a utenti autorizzati. Già nel framework 2 era possibile applicare dei filtri a tutti gli action methods di un controller semplicemente applicando l’attributo alla classe controller e non al singolo metodo. Dalla versione 3 possiamo aggiungere dei filtri in una speciale collection, chiamata GlobalFilterCollection, in modo che questi si applichino a tutti i controller dell’applicazione.

Fino al framework 2 lo scambio dati tra controller e view non tipizzate avveniva attraverso la proprietà ViewData, in pratica un dizionario comune il cui depositare i dati da scambiare. Il problema di questo dizionario è che l’indicizzazione degli elementi avviene attraverso una stringa, che naturalmente è soggetta a errori di digitazione. Ad esempio ViewData["Messaggio"]="Ciao Mondo!", richiede che sia nel controller che nella view la stringa “Messaggio” sia digitata correttamente. Con MVC 3, basato sul framework 4, è stato aggiunto un nuovo elemento di tipo dynamic, denominato ViewBag, che ci permette di scrivere un’istruzione del tipo ViewBag.Messaggio="Ciao Mondo!".

Miglioramenti a JavaScript e Ajax

La validazione lato client, realizzata con il plugin jQueryValidate della libreria jQuery, è adesso abilitata di default, quindi non è più necessario abilitarla esplicitamente, inoltre è possibile disabilitarla direttamente da web.config. Un’altra funzionalità abilitata di default da MVC 3 e 4 e disabilitabile da web.config è l’Unobtrusive Javascript, che evita la generazione in linea del codice javascript nelle nostre view.
Con MVC 3 è stato poi aggiunto un nuovo attributo di validazione dei dati, il Remote Validator, che permette di sfruttare il plugin di validazione di jQuery per eseguire la validazione remota di un dato immesso dall’utente. Possiamo quindi, semplicemente specificandolo con un attributo, andare ad esempio a verificare che il dato immesso dall’utente non esista già sul database prima dell’invio della form al server.
E’ stato anche introdotto il supporto al binding di dati JSON, il che ci permette di andare a invocare con una chiamata JSON un action method del nostro controller e ritrovarci automaticamente valorizzati i parametri del metodo invocato con i valori ricevuti.

Miglioramenti alla validazione del Model

Come vedremo nell'articolo sul Model, Asp.Net MVC permette mediante specifici attributi, di andare a decorare le proprietà delle classi del model con le regole di validazione dei dati. Oltre al Remote Validator che abbiamo già introdotto, è stato aggiunto un nuovo validatore per il confronto tra proprietà diverse di una stessa classe del model, il Compare Validator: pensiamo al classico esempio della digitazione di una password in fase di registrazione di un utente, dove tipicamente è richiesta una doppia digitazione per la verifica della correttezza del dato immesso.

Web API

Per venire incontro alle specifiche e continue richieste di realizzazione di servizi REST in maniera semplice e veloce, con la versione 4 è stato introdotto un nuovo framework chiamato Web API. Utilizzando lo stesso approccio già visto con il pattern MVC è possibile realizzare dei controller che estendono una classe base denominata ApiController (al posto di Controller, utilizzato invece  per MVC): in questo caso le action che realizziamo rappresentano i servizi REST che vogliamo esporre. Utilizzando una regola di routing separata da quella di MVC, che di default vede il prefisso /api/ davanti alle chiamate verso gli API Controller, l'idea di base di Web API è realizzare un controller per ogni entità da gestire, fornendo per ognuna le action per rispondere ai verbi http GET, POST, PUT, DELETE. Una feature interessante di questo framework, oltre la semplicità con cui è possibile realizzare servizi REST, è che possiamo chiedere che il risultato dell'elaborazione ci venga restituito in XML o in JSON, semplicemente specificandolo in un header della richiesta. Nei prossimi articoli entreremo meglio nel dettaglio e capiremo a fondo l'utilità di tale framework.

Mobile Template e Display Modes

Lo sviluppo web per dispositivi mobile è stata un'altro destinatario delle attenzioni del team di Microsoft per la release 4 di MVC. In questa versione infatti fu rilasciato un nuovo template basato su Bootstrap che, basandosi sul concetto di Responsive Design, mostra come sia possibile adattare il contenuto della propria pagina alle dimensionsi del display del dispositivo che sta visualizzando il nostro sito web. Inoltre fu rilasciata una feature molto apprezzata dagli sviluppatori, chiamata Display Modes, grazie alla quale è possibile realizzare view specifiche per dispositivo e lasciare che il framework, con delle regole di default o personalizzandole, selezioni la view giusta (lato server) da renderizzare in base al dispositivo chiamante. Provate ad esempio a duplicare la view Index.cshtml nel template base o in un vostro progetto e a rinominarla in Index.mobile.cshtml: se richiamate il sito da uno smartphone o un tablet (oppure utilizzate qualche tool del browser per simulare la richiesta da tali dispositivi) potrete ammirare questa funzionalità del framework che esamineremo da vicino in uno dei prossimi articoli.

Ottimizzazioni per il web

Altre novità arrivate con il framework 4 ci permettono di ottimizzare il modo in cui restituiamo alcune risorse al client durante una richiesta. Partendo dalla considerazione che oltre alla dimensione dei dati scambiati è importante anche minimizzare il numero di elementi scambaiti, per i quali il browser fa una richiesta http separata al server, è stato introdotto un framework per il Bundling e la Minification. Il bundling ci permette di mettere insieme dei file che normalmente forniamo al client come singoli elementi in un unico file, pensate ad esempio ai file css e javascript, in modo che il browser veda all'interno della pagina html ricevuta un unico o un sottoinsieme di link a tali risorse, aprendo così meno connessioni http al server per il loro recupero. Inoltre la minification ci permette di eliminare tutti i caratteri non necessari e a compattare il più possibile tali file velocizzando sensibilmente il loro download.

Aspetti avanzati

Per aiutarci a migliorare le performance delle nostre applicazioni, Asp.Net MVC ci fornisce la possibilità di eseguire il caching dell’html generato a partire dalle view. Fino alla versione 2 questo era possibile solo per l’intera pagina, con la versione 3 possiamo farlo anche per porzioni della pagina, ognuna con valori di durata del dato nella cache indipendente. Questo tipo di caching è detto Partial-Page Output Caching.
Un tool molto interessante installato e abilitato di default insieme a MVC 3 è NuGet, un package manager che ci permette di trovare, installare e usare nei nostri progetti delle librerie open source come NHibernate o RhinoMocks. Per chi invece fa uso di tecniche di Dependency Injection la buona notizia è che MVC 3 introduce un ottimo supporto per l’integrazione del framework con IoC containers, mentre in MVC 4 viene introdotto il concetto di DependencyResolver, che permette di risolvere i tipi in qualsiasi punto dell'applicazione. Approfondiremo questo aspetto nei capitoli riguardanti il testing delle applicazioni e le best practices da utilizzare in progetti complessi.

E in MVC6? Cosa cambia?

Senza nascondersi dietro lunghi discorsi filosofici diciamo subito che in Asp.Net MVC 6 molte cose cambieranno. La nuova versione, spesso indicata con il nome vnext, è attualmente in beta e introduce tantissime novità in linea con le tante novità introdotte con le nuove versioni del .Net Framework. Ad esempio MVC e Web API diventeranno un unico framework, la Dependency Injection diventerà un punto cruciale nel funzionamento delle applicazioni che svilupperemo, ci sarà un supporto da parte di Microsoft per lo sviluppo di applciazioni web che gireranno su sistemi operativi diversi da Windows, scomparirà il web.config....

In questa serie di articoli si è deciso di non affrontare MVC 6, nonostante di tanto in tanto sarà fatto qualche riferimento a quello che succederà. In ogni caso concentrarsi sui concetti fondamentali dietro il framework e nel framework sarà comunque un'ottima base da cui partire con la futura versione 6 e anche in questo caso potremmo fino in fondo apprezzare le tante novità che ci saranno offerte.

Conclusioni

In questo articolo si è cercato di analizzare come il framework MVC si sia evoluto attraverso i rilasci delle varie versioni, in modo da poter apprezzare quello che abbiamo oggi e sapere cosa aspettarsi quando magari ci si ritrova a lavorare su un progetto datato e una vecchia versione del framework. Le novità non finiscono qui, ovviamente, ma prima di analizzare le restanti abbiamo bisogno di approfondire alcuni concetti legati al framework in modo da poterli apprezzare fino in fondo.