ASP.NET Core MVC e Razor Pages sono due approcci offerti da Microsoft e facenti parte di ASP.NET Core per lo sviluppo di pagine Web dinamiche. ASP.NET Core MVC è un framework di sviluppo Web basato su pattern di progettazione MVC (Model-View-Controller), che prevede la separazione del codice in tre componenti principali: il modello, che rappresenta i dati dell'applicazione; la vista, che gestisce l'interfaccia utente; e il controller, che gestisce la logica di business e l'interazione tra il modello e la vista. Offre una grande flessibilità e scalabilità nell'organizzazione dell'applicazione e nella gestione dei dati e delle richieste dell'utente.
Razor Pages, d'altra parte, come visto nella precedente lezione, prevede la separazione del codice in pagine Web con estensione .cshtml
che contengono sia il markup HTML che il codice di backend. Offre inoltre una sintassi di visualizzazione molto intuitiva e semplice da usare, con un approccio basato su convenzioni per la gestione delle richieste dell'utente e delle risposte. Ogni pagina Razor ha il proprio modello di dati, la propria logica di backend e la propria vista. Ciò semplifica l'organizzazione del codice e riduce la complessità dell'applicazione.
Differenze tra ASP.NET Core MVC e Razor Pages
Alcune delle differenze chiave tra ASP.NET Core MVC e Razor Pages possono essere riassunte in:
- complessità: Razor Pages offre un'esperienza di sviluppo più semplice e diretta. Combina infatti la logica di backend e l'interfaccia utente all'interno della stessa pagina, riducendo la complessità generale dell'applicazione. MVC, d'altra parte, offre una maggiore flessibilità ma può richiedere un po' più di tempo per essere configurato correttamente.
- Separazione dei compiti: MVC offre una separazione più chiara dei compiti tra il modello, la vista e il controller, consentendo una maggiore modularità e riusabilità del codice. Razor Pages, invece, organizza il codice all'interno delle pagine Razor, rendendo più difficile la separazione dei compiti e la riusabilità del codice in diverse parti dell'applicazione.
- Scalabilità: per via della sua natura modulare e della maggiore separazione dei compiti, MVC è spesso considerato più adatto per applicazioni Web complesse e di grandi dimensioni. Razor Pages, d'altra parte, è più indicato per applicazioni più semplici e di piccole dimensioni.
In sintesi, la scelta tra ASP.NET Core MVC e Razor Pages dipende dalle esigenze specifiche del progetto e dalla complessità dell'applicazione Web che si intende sviluppare. Entrambi gli approcci offrono vantaggi e svantaggi. La scelta migliore dipenderà dalle esigenze di sviluppo e dai requisiti del progetto.
Scegliere tra ASP.NET Core MVC e Razor Pages
In questa guida ci concentriamo maggiormente sulle Razor Pages, invece che su ASP.NET Core MVC, perché sono diventate l'approccio consigliato per la costruzione di applicazioni con rendering lato server. E' pur vero, però, che se stiamo creando un'API Web per lavorare con App mobile o client-side, molto probabilmente converrebbe adoperare direttamente il framework MVC.
Invece di un PageModel e un gestore di pagine, MVC utilizza il concetto di controller e metodi di azione. Questi sono quasi analoghi ai loro corrispettivi nelle Razor Pages. Un'azione è un metodo che viene eseguito in risposta a una richiesta. Un controller MVC è una classe che contiene un numero di metodi di azione logicamente raggruppati.
D'altra parte, i controller MVC utilizzano modelli di view espliciti per passare dati a una vista Razor, anziché esporre i dati come proprietà su se stessi (come fanno le Razor Pages con i PageModel).
Esempio di MVC in ASP.NET Core
Il codice mostrato in basso è un esempio di come un controller MVC fornisca la stessa funzionalità della Razor Page che abbiamo presentato nella lezione precedente. Nell'MVC, i controller vengono spesso utilizzati per aggregare azioni simili, quindi in questo caso il controller viene chiamato ToDoController
, perché conterrà tipicamente ulteriori metodi di azione per lavorare con elementi di to-do
, come ad esempio azioni per visualizzare un elemento specifico o per crearne uno nuovo.
public class ToDoController : Controller
{
private readonly ToDoService _service;
public ToDoController(ToDoService service)
{
_service = service;
}
public ActionResult Category(string id)
{
var items = _service.GetItemsForCategory(id);
var viewModel = new CategoryViewModel(items);
return View(viewModel);
}
public ActionResult Create(ToDoListModel model)
{
// ...
}
}
Il codice rappresenta una classe di un controller MVC chiamata ToDoController
che eredita dalla classe Controller
di ASP.NET Core. La classe ha due metodi pubblici: Category
e Create
. Il costruttore della classe prende in input un'istanza del servizio ToDoService
e la memorizza in una variabile privata _service
per poter essere utilizzata successivamente nei metodi della classe. Il metodo Category
prende in input una stringa id
e la utilizza per la visualizzazione di una categoria di elementi di to-do.
All'interno del metodo viene utilizzato il servizio chiamato ToDoService
per ottenere gli elementi associati alla categoria specificata. Successivamente, viene creato un oggetto CategoryViewModel
con gli elementi ottenuti dal servizio, che viene poi passato come modello alla vista tramite il metodo View
, che restituisce una vista da visualizzare. Il metodo Create
è utilizzato per gestire la creazione di nuovi elementi di to-do, prendendo in input un oggetto ToDoListModel
come modello.
Conclusioni
A parte alcune differenze di denominazione, il ToDoController
assomiglia molto all'equivalente di Razor Page mostrato nella scorsa lezione. Infatti, dal punto di vista architetturale, Razor Pages e MVC sono essenzialmente equivalenti, in quanto entrambi utilizzano il pattern di design MVC. Le differenze più evidenti riguardano essenzialmente la posizione dei file nel progetto, come discusso nella prossima lezione.