Condividi tramite


Parte 2. Controllers

di Jon Galloway

MVC Music Store è un'applicazione di esercitazione che introduce e spiega in modo dettagliato come usare ASP.NET MVC e Visual Studio per lo sviluppo Web.

MVC Music Store è un'implementazione di negozio di esempio leggera che vende album musicali online e implementa l'amministrazione del sito di base, l'accesso utente e la funzionalità del carrello acquisti.

Questa serie di esercitazioni illustra in dettaglio tutti i passaggi eseguiti per compilare l'applicazione di esempio MVC Music Store ASP.NET. La parte 2 riguarda i controller.

Con i framework Web tradizionali, gli URL in ingresso vengono in genere mappati ai file su disco. Ad esempio, una richiesta per un URL come "/Products.aspx" o "/Products.php" può essere elaborata da un file "Products.aspx" o "Products.php".

I framework MVC basati sul Web mappano gli URL al codice del server in modo leggermente diverso. Anziché eseguire il mapping degli URL in ingresso ai file, vengono invece mappati agli URL ai metodi nelle classi. Queste classi sono denominate "Controller" e sono responsabili dell'elaborazione di richieste HTTP in ingresso, gestione dell'input utente, recupero e salvataggio dei dati e determinazione della risposta per l'invio al client (visualizzare HTML, scaricare un file, reindirizzare a un URL diverso e così via).

Aggiunta di un homeController

Verrà avviata l'applicazione MVC Music Store aggiungendo una classe Controller che gestirà gli URL alla Home page del sito. Seguiremo le convenzioni di denominazione predefinite di ASP.NET MVC e chiamarlo HomeController.

Fare clic con il pulsante destro del mouse sulla cartella "Controller" all'interno del Esplora soluzioni e selezionare "Aggiungi" e quindi "Controller..." Comando:

Screenshot delle diverse opzioni di elenco per l'aggiunta di un'opzione Home Controler al tuo archivio musicale.

Verrà visualizzata la finestra di dialogo "Aggiungi controller". Assegnare al controller il nome "HomeController" e premere il pulsante Aggiungi.

Screenshot della finestra di dialogo Home Controller contenente opzioni diverse per la creazione del pulsante.

Verrà creato un nuovo file, HomeController.cs, con il codice seguente:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
 
namespace MvcMusicStore.Controllers
{
    public class HomeController : Controller
    {
        //
        // GET: /Home/
        public ActionResult Index()
        {
            return View();
        }
    }
}

Per iniziare il più semplicemente possibile, sostituire il metodo Index con un metodo semplice che restituisce solo una stringa. Verranno apportate due modifiche:

  • Modificare il metodo per restituire una stringa anziché un ActionResult
  • Modificare l'istruzione return per restituire "Hello from Home"

Il metodo dovrebbe ora essere simile al seguente:

public string Index()
{
    return "Hello from Home";
}

Esecuzione dell'applicazione

Ora eseguiamo il sito. È possibile avviare il server Web e provare il sito usando uno dei seguenti elementi:

  • Scegliere la voce di menu Debug ⇨ Avvia debug
  • Fare clic sul pulsante Freccia verde nella barra degli strumenti Screenshot delle opzioni della barra degli strumenti dell'archivio musicali, evidenziando l'opzione di debug e contrassegnando la freccia da fare clic per indicare all'applicazione di eseguire la funzionalità di debug.
  • Usare il tasto di scelta rapida F5.

L'uso di uno dei passaggi precedenti eseguirà la compilazione del progetto e quindi causerà l'avvio del server di sviluppo ASP.NET integrato in Visual Web Developer. Verrà visualizzata una notifica nell'angolo inferiore della schermata per indicare che il ASP.NET Development Server è stato avviato e mostrerà il numero di porta in esecuzione.

Screenshot della notifica popup visualizzata nell'angolo inferiore destro della pagina, che indica che il server di sviluppo è stato avviato in localhost 26641.

Visual Web Developer aprirà automaticamente una finestra del browser il cui URL punta al web-server. Ciò consentirà di provare rapidamente l'applicazione Web:

Screenshot della finestra del browser avviata automaticamente all'avvio del server di sviluppo nel localhost. Nella finestra vengono visualizzate le parole

Ok, è stato abbastanza veloce : abbiamo creato un nuovo sito Web, aggiunto una funzione a tre righe e abbiamo testo in un browser. Non la scienza razzo, ma è un inizio.

Nota: Visual Web Developer include il ASP.NET Development Server, che eseguirà il sito Web in un numero di "porta" casuale. Nella schermata precedente il sito è in esecuzione in http://localhost:26641/, quindi usa la porta 26641. Il numero di porta sarà diverso. Quando si parla di URL come /Store/Sfoglia in questa esercitazione, questa operazione verrà eseguita dopo il numero di porta. Supponendo che un numero di porta pari a 26641, passare a /Store/Sfoglia significa passare a http://localhost:26641/Store/Browse.

Aggiunta di un StoreController

È stato aggiunto un semplice HomeController che implementa la Home Page del sito. Aggiungiamo ora un altro controller che useremo per implementare la funzionalità di esplorazione del nostro negozio musicale. Il controller dello store supporta tre scenari:

  • Una pagina di presentazione dei generi musicali nel nostro negozio musicale
  • Pagina sfoglia che elenca tutti gli album musicali in un determinato genere
  • Pagina dei dettagli che mostra informazioni su un album musicale specifico

Si inizierà aggiungendo una nuova classe StoreController. Se non è già stato fatto, arrestare l'esecuzione dell'applicazione chiudendo il browser o selezionando la voce di menu Debug ⇨ Arresta debug.

Aggiungere ora un nuovo StoreController. Proprio come abbiamo fatto con HomeController, lo faremo facendo clic con il pulsante destro del mouse sulla cartella "Controller" all'interno della Esplora soluzioni e scegliendo la voce di menu Add-Controller>

Screenshot di un menu della finestra con selezioni per l'aggiunta delle opzioni del controller di archiviazione all'applicazione dell'archivio musicale.

Il nuovo StoreController ha già un metodo "Index". Useremo questo metodo "Index" per implementare la pagina di presentazione che elenca tutti i generi nel nostro negozio musicale. Aggiungeremo anche due metodi aggiuntivi per implementare i due altri scenari che vogliamo che StoreController gestisca: Sfoglia e Dettagli.

Questi metodi (Indice, Sfoglia e Dettagli) all'interno del controller sono denominati "Azioni controller" e, come già visto con il metodo HomeController.Index(), il processo consiste nel rispondere alle richieste URL e (in genere) determinare il contenuto da inviare al browser o all'utente che ha richiamato l'URL.

Verrà avviata l'implementazione di StoreController modificando il metodoIndex() per restituire la stringa "Hello from Store.Index()" e verranno aggiunti metodi simili per Browse() e Details():

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
 
namespace MvcMusicStore.Controllers
{
    public class StoreController : Controller
    {
        //
        // GET: /Store/
        public string Index()
        {
            return "Hello from Store.Index()";
        }
        //
        // GET: /Store/Browse
        public string Browse()
        {
            return "Hello from Store.Browse()";
        }
        //
        // GET: /Store/Details
        public string Details()
        {
            return "Hello from Store.Details()";
        }
    }
}

Eseguire di nuovo il progetto e esplorare gli URL seguenti:

  • /Negozio
  • /Store/Sfoglia
  • /Store/Dettagli

L'accesso a questi URL richiama i metodi di azione all'interno del controller e restituirà le risposte alle stringhe:

Screenshot del browser della finestra, che mostra un esempio dei metodi di azione richiamati durante l'accesso a U R L. Mostra la risposta stringa seguente: Hello from Store.Details()

È fantastico, ma queste sono solo stringhe costanti. È possibile renderli dinamici, quindi accettano informazioni dall'URL e la visualizzano nell'output della pagina.

Prima di tutto verrà modificato il metodo di azione Sfoglia per recuperare un valore querystring dall'URL. A tale scopo, è possibile aggiungere un parametro "genere" al metodo action. Quando si esegue questa operazione ASP.NET MVC passerà automaticamente qualsiasi parametro querystring o post form denominato "genere" al metodo di azione quando viene richiamato.

//
// GET: /Store/Browse?genre=Disco
public string Browse(string genre)
 {
    string message = HttpUtility.HtmlEncode("Store.Browse, Genre = "
+ genre);
 
    return message;
 }

Nota: si usa il metodo di utilità HttpUtility.HtmlEncode per sanificare l'input utente. Ciò impedisce agli utenti di inserire Javascript nella visualizzazione con un collegamento come /Store/Sfoglia? Genere=<finestra script.location>='http://hackersite.com'</script>.

A questo punto, passare a /Store/Sfoglia? Genere=Disco

Screenshot che mostra un altro esempio di stringa (Store.Browse, Genre = Disco) restituito dall'URL durante il recupero di un valore querystring quando si aggiunge il parametro 'genere'.

Verrà quindi modificata l'azione Dettagli per leggere e visualizzare un parametro di input denominato ID. A differenza del metodo precedente, non verrà incorporato il valore ID come parametro querystring. Verrà invece incorporato direttamente all'interno dell'URL stesso. Ad esempio: /Store/Details/5.

ASP.NET MVC consente di eseguire facilmente questa operazione senza dover configurare nulla. ASP.NET convenzione di routing predefinita di MVC consiste nel considerare il segmento di un URL dopo il nome del metodo di azione come parametro denominato "ID". Se il metodo action ha un parametro denominato ID, ASP.NET MVC passerà automaticamente il segmento URL come parametro.

//
// GET: /Store/Details/5
public string Details(int id)
 {
    string message = "Store.Details, ID = " + id;
 
    return message;
 }

Eseguire l'applicazione e passare a /Store/Details/5:

Screenshot del parametro passato dal segmento U R L. Il parametro è una stringa che legge Store.Details, ID=5.

Ecco cosa abbiamo fatto finora:

  • È stato creato un nuovo progetto ASP.NET MVC in Visual Web Developer
  • È stata illustrata la struttura di cartelle di base di un'applicazione MVC ASP.NET
  • Si è appreso come eseguire il sito Web usando il server di sviluppo ASP.NET
  • Sono state create due classi controller: homeController e StoreController
  • Sono stati aggiunti metodi di azione ai controller che rispondono alle richieste URL e restituiscono testo al browser