Condividi tramite


Informazioni su modelli, visualizzazioni e controller (C#)

di Stephen Walther

Confuso su modelli, visualizzazioni e controller? In questa esercitazione Stephen Walther presenta le diverse parti di un'applicazione MVC ASP.NET.

Questa esercitazione offre una panoramica generale di ASP.NET modelli, viste e controller MVC. In altre parole, spiega M', V' e C' in ASP.NET MVC.

Dopo aver letto questa esercitazione, è necessario comprendere come interagiscono le diverse parti di un'applicazione MVC ASP.NET. È anche necessario comprendere come l'architettura di un'applicazione MVC ASP.NET differisce da un'applicazione Web Forms ASP.NET o da un'applicazione Active Server Pages.

Applicazione MVC di esempio ASP.NET

Il modello predefinito di Visual Studio per la creazione di ASP.NET applicazioni Web MVC include un'applicazione di esempio estremamente semplice che può essere usata per comprendere le diverse parti di un'applicazione MVC ASP.NET. In questa esercitazione si sfrutta questa semplice applicazione.

Si crea una nuova applicazione ASP.NET MVC con il modello MVC avviando Visual Studio 2008 e selezionando l'opzione di menu File, Nuovo progetto (vedere la figura 1). Nella finestra di dialogo Nuovo progetto selezionare il linguaggio di programmazione preferito in Tipi di progetto (Visual Basic o C#) e selezionare ASP.NET'applicazione Web MVC in Modelli. Fare clic sul pulsante OK.

Finestra di dialogo Nuovo progetto

Figura 01: Finestra di dialogo Nuovo progetto (fare clic per visualizzare l'immagine a dimensione intera)

Quando si crea una nuova applicazione MVC ASP.NET, viene visualizzata la finestra di dialogo Crea progetto unit test (vedere la figura 2). Questa finestra di dialogo consente di creare un progetto separato nella soluzione per testare l'applicazione ASP.NET MVC. Selezionare l'opzione No, non creare un progetto di unit test e fare clic sul pulsante OK .

Finestra di dialogo Crea unit test

Figura 02: Finestra di dialogo Crea unit test (fare clic per visualizzare l'immagine a dimensione intera)

Dopo aver creato la nuova applicazione MVC ASP.NET. Nella finestra Esplora soluzioni verranno visualizzati diversi file e cartelle. In particolare, verranno visualizzate tre cartelle denominate Models, Views e Controllers. Come si potrebbe immaginare dai nomi delle cartelle, queste cartelle contengono i file per l'implementazione di modelli, visualizzazioni e controller.

Se si espande la cartella Controllers, verrà visualizzato un file denominato AccountController.cs e un file denominato HomeController.cs. Se si espande la cartella Views, verranno visualizzate tre sottocartelle denominate Account, Home e Shared. Se si espande la cartella Home, verranno visualizzati due file aggiuntivi denominati About.aspx e Index.aspx (vedere la figura 3). Questi file costituiscono l'applicazione di esempio inclusa nel modello MVC ASP.NET predefinito.

Finestra Esplora soluzioni

Figura 03: Finestra Esplora soluzioni (fare clic per visualizzare l'immagine a dimensione intera)

È possibile eseguire l'applicazione di esempio selezionando l'opzione di menu Debug, Avvia debug. In alternativa, è possibile premere F5.

Quando si esegue per la prima volta un'applicazione ASP.NET, viene visualizzata la finestra di dialogo nella figura 4 che consiglia di abilitare la modalità di debug. Fare clic sul pulsante OK e l'applicazione verrà eseguita.

Finestra di dialogo Debug non abilitato

Figura 04: finestra di dialogo Debug non abilitato (fare clic per visualizzare l'immagine a dimensione intera)

Quando si esegue un'applicazione MVC ASP.NET, Visual Studio avvia l'applicazione nel Web browser. L'applicazione di esempio è costituita da solo due pagine: la pagina Indice e la pagina Informazioni. All'avvio dell'applicazione, viene visualizzata la pagina Indice (vedere la figura 5). È possibile passare alla pagina Informazioni facendo clic sul collegamento di menu in alto a destra dell'applicazione.

Pagina Indice

Figura 05: Pagina indice (fare clic per visualizzare l'immagine a dimensione intera)

Si notino gli URL nella barra degli indirizzi del browser. Ad esempio, quando si fa clic sul collegamento di menu Informazioni, l'URL nella barra degli indirizzi del browser cambia in /Home/About.

Se si chiude la finestra del browser e si torna a Visual Studio, non sarà possibile trovare un file con il percorso Home/Informazioni. I file non esistono. Com'è possibile?

Un URL non è uguale a una pagina

Quando si compila un'applicazione Web Forms ASP.NET tradizionale o un'applicazione Active Server Pages, esiste una corrispondenza uno-a-uno tra un URL e una pagina. Se si richiede una pagina denominata SomePage.aspx dal server, è preferibile che nel disco sia presente una pagina denominata SomePage.aspx. Se il file SomePage.aspx non esiste, viene visualizzato un errore 404 - Pagina non trovata .

Quando si compila un'applicazione MVC ASP.NET, al contrario, non esiste alcuna corrispondenza tra l'URL digitato nella barra degli indirizzi del browser e i file presenti nell'applicazione. In un'applicazione ASP.NET MVC, un URL corrisponde a un'azione del controller anziché a una pagina su disco.

In un'applicazione asp o ASP.NET tradizionale, le richieste del browser vengono mappate alle pagine. In un'applicazione MVC ASP.NET, al contrario, le richieste del browser vengono mappate alle azioni del controller. Un'applicazione Web Forms ASP.NET è incentrata sul contenuto. Un'applicazione MVC ASP.NET, al contrario, è incentrata sulla logica dell'applicazione.

Informazioni sul routing ASP.NET

Una richiesta del browser viene mappata a un'azione del controller tramite una funzionalità del framework di ASP.NET denominato routing ASP.NET. ASP.NET Routing viene usato dal framework MVC ASP.NET per instradare le richieste in ingresso alle azioni del controller.

ASP.NET Routing usa una tabella di route per gestire le richieste in ingresso. Questa tabella di route viene creata al primo avvio dell'applicazione Web. La tabella di route è configurata nel file Global.asax. Il file MVC Global.asax predefinito è contenuto nell'elenco 1.

Elenco 1 - Global.asax

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MvcApplication1
{
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit https://go.microsoft.com/?LinkId=9394801

    public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default",                                              // Route name
                "{controller}/{action}/{id}",                           // URL with parameters
                new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
            );

        }

        protected void Application_Start()
        {
            RegisterRoutes(RouteTable.Routes);
        }
    }
}

All'avvio di un'applicazione ASP.NET, viene chiamato il metodo Application_Start(). In Listato 1 questo metodo chiama il metodo RegisterRoutes() e il metodo RegisterRoutes() crea la tabella di route predefinita.

La tabella di route predefinita è costituita da una route. Questa route predefinita suddivide tutte le richieste in ingresso in tre segmenti (un segmento URL è qualsiasi elemento tra le barre). Il primo segmento viene mappato a un nome controller, il secondo segmento viene mappato a un nome di azione e il segmento finale viene mappato a un parametro passato all'azione denominata ID.

Si consideri ad esempio l'URL seguente:

/Product/Details/3

Questo URL viene analizzato in tre parametri come segue:

Controller = Prodotto

Action = Details

ID = 3

La route predefinita definita nel file Global.asax include i valori predefiniti per tutti e tre i parametri. Il controller predefinito è Home, l'azione predefinita è Index e l'ID predefinito è una stringa vuota. Tenendo presenti queste impostazioni predefinite, considerare il modo in cui viene analizzato l'URL seguente:

/Employee

Questo URL viene analizzato in tre parametri come segue:

Controller = Employee

Action = Index

Id =

Infine, se si apre un'applicazione MVC ASP.NET senza specificare alcun URL ( ad esempio , http://localhost), l'URL viene analizzato come segue:

Controller = Home

Action = Index

Id =

La richiesta viene indirizzata all'azione Index() nella classe HomeController.

Informazioni sui controller

Un controller è responsabile del controllo del modo in cui un utente interagisce con un'applicazione MVC. Un controller contiene la logica di controllo del flusso per un'applicazione MVC ASP.NET. Un controller determina la risposta da inviare a un utente quando un utente effettua una richiesta del browser.

Un controller è solo una classe , ad esempio una classe Visual Basic o C#. L'applicazione MVC ASP.NET di esempio include un controller denominato HomeController.cs nella cartella Controller. Il contenuto del file HomeController.cs viene riprodotto nell'elenco 2.

Elenco 2 - HomeController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            ViewData["Title"] = "Home Page";
            ViewData["Message"] = "Welcome to ASP.NET MVC!";

            return View();
        }

        public ActionResult About()
        {
            ViewData["Title"] = "About Page";

            return View();
        }
    }
}

Si noti che HomeController ha due metodi denominati Index() e About(). Questi due metodi corrispondono alle due azioni esposte dal controller. L'URL /Home/Index richiama il metodo HomeController.Index() e l'URL /Home/About richiama il metodo HomeController.About().

Qualsiasi metodo pubblico in un controller viene esposto come azione controller. È necessario prestare attenzione a questo. Ciò significa che qualsiasi metodo pubblico contenuto in un controller può essere richiamato da chiunque abbia accesso a Internet immettendo l'URL corretto in un browser.

Informazioni sulle viste

Le due azioni controller esposte dalla classe HomeController, Index() e About(), restituiscono una visualizzazione. Una visualizzazione contiene il markup HTML e il contenuto inviati al browser. Una visualizzazione è l'equivalente di una pagina quando si usa un'applicazione MVC ASP.NET.

È necessario creare le visualizzazioni nella posizione corretta. L'azione HomeController.Index() restituisce una visualizzazione disponibile nel percorso seguente:

\Views\Home\Index.aspx

L'azione HomeController.About() restituisce una visualizzazione disponibile nel percorso seguente:

\Views\Home\About.aspx

In generale, se si vuole restituire una visualizzazione per un'azione controller, è necessario creare una sottocartella nella cartella Views con lo stesso nome del controller. Nella sottocartella è necessario creare un file aspx con lo stesso nome dell'azione del controller.

Il file nell'elenco 3 contiene la visualizzazione About.aspx.

Elenco 3 - About.aspx

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>

<asp:Content ID="aboutContent" ContentPlaceHolderID="MainContent" runat="server">
    <h2>About</h2>
    <p>
        Put content here.
    </p>
</asp:Content>

Se si ignora la prima riga nell'elenco 3, la maggior parte del resto della visualizzazione è costituita da HTML standard. È possibile modificare il contenuto della visualizzazione immettendo qualsiasi CODICE HTML desiderato qui.

Una visualizzazione è molto simile a una pagina in Pagine server attive o Web Forms ASP.NET. Una visualizzazione può contenere contenuto e script HTML. È possibile scrivere gli script nel linguaggio di programmazione .NET preferito, ad esempio C# o Visual Basic .NET. Si usano script per visualizzare contenuto dinamico, ad esempio i dati del database.

Informazioni sui modelli

Sono stati illustrati i controller e sono state illustrate le visualizzazioni. L'ultimo argomento che è necessario discutere è modelli. Che cos'è un modello MVC?

Un modello MVC contiene tutta la logica dell'applicazione che non è contenuta in una visualizzazione o in un controller. Il modello deve contenere tutta la logica di business dell'applicazione, la logica di convalida e la logica di accesso al database. Ad esempio, se si usa Microsoft Entity Framework per accedere al database, creare le classi Entity Framework (file con estensione edmx) nella cartella Models.

Una visualizzazione deve contenere solo la logica correlata alla generazione dell'interfaccia utente. Un controller deve contenere solo il minimo minimo di logica necessario per restituire la visualizzazione corretta o reindirizzare l'utente a un'altra azione (controllo flusso). Tutto il resto deve essere contenuto nel modello.

In generale, è consigliabile cercare modelli di grasso e controller skinny. I metodi controller devono contenere solo alcune righe di codice. Se un'azione del controller diventa troppo grasso, è consigliabile spostare la logica in una nuova classe nella cartella Models.

Riepilogo

Questa esercitazione ha fornito una panoramica generale delle diverse parti di un'applicazione Web MVC ASP.NET. Si è appreso come ASP.NET Routing esegue il mapping delle richieste del browser in ingresso a determinate azioni del controller. Si è appreso come i controller orchestrano la modalità di restituzione delle visualizzazioni al browser. Infine, si è appreso come i modelli contengono la logica di accesso alle applicazioni, alla convalida e al database.