Condividi tramite


Aggiunta di una visualizzazione a un'applicazione MVC

di Rick Anderson

Annotazioni

Una versione aggiornata di questa esercitazione è disponibile qui usando la versione più recente di Visual Studio. La nuova esercitazione usa ASP.NET Core MVC, che offre molti miglioramenti in questa esercitazione.

Questa esercitazione illustra ASP.NET Core MVC con controller e visualizzazioni. Razor Pages è una nuova alternativa in ASP.NET Core, un modello di programmazione basato su pagine che semplifica la creazione dell'interfaccia utente Web e una maggiore produttività. È consigliabile provare l'esercitazione su Razor Pages prima della versione di MVC. Il tutorial su Razor Pages:

  • È più facile da seguire.
  • Vengono illustrate altre funzionalità.
  • È l'approccio preferito per lo sviluppo di nuove app.

In questa sezione, modificherai la classe HelloWorldController per utilizzare i file di modello visuale al fine di incapsulare in modo chiaro il processo di generazione di risposte HTML al client.

Si creerà un file modello di visualizzazione usando il motore di visualizzazione Razor. I modelli di visualizzazione basati su Razor hanno un'estensione di file con estensione cshtml e offrono un modo elegante per creare l'output HTML usando C#. Razor riduce al minimo il numero di caratteri e sequenze di tasti necessari durante la scrittura di un modello di visualizzazione e consente un flusso di lavoro di codifica rapido e fluido.

Attualmente il Index metodo restituisce una stringa con un messaggio hardcoded nella classe controller. Modificare il metodo Index per chiamare il metodo View del controller, come illustrato nel codice seguente.

public ActionResult Index() 
{ 
    return View(); 
}

Il Index metodo precedente usa un modello di visualizzazione per generare una risposta HTML al browser. I metodi controller (noti anche come metodi di azione), ad esempio il Index metodo precedente, in genere restituiscono un ActionResult (o una classe derivata da ActionResult), non tipi primitivi come string.

Fare clic con il pulsante destro del mouse sulla cartella Views\HelloWorld e scegliere Aggiungi, quindi fare clic su Pagina visualizzazione MVC 5 con layout (Razor).

Screenshot che mostra la finestra Esplora soluzioni. Il menu di scelta rapida Hello World e Aggiungi sottomenu sono aperti e viene selezionata l'opzione M V V 5 View Page with Layout Razor (Visualizza pagina M V C 5 con Layout Razor).

Nella finestra di dialogo Specifica nome per elemento immettere Indice e quindi fare clic su OK.

Screenshot che mostra la finestra di dialogo Specifica nome per l'elemento. L'indice si trova nel campo Nome elemento.

Nella finestra di dialogo Seleziona pagina layout accettare il _Layout.cshtml predefinito e fare clic su OK.

Screenshot che mostra la pagina Seleziona un layout. La sottocartella Shared è aperta e l'opzione Layout dot c s h t m l è selezionata.

Nella finestra di dialogo precedente la cartella Views\Shared è selezionata nel riquadro sinistro. Se si dispone di un file di layout personalizzato in un'altra cartella, è possibile selezionarlo. Il file di layout verrà illustrato più avanti nell'esercitazione

Viene creato il file MvcMovie\Views\HelloWorld\Index.cshtml .

Screenshot che mostra la finestra Esplora soluzioni. La cartella Views e la sottocartella Hello World sono aperte.

Aggiungere il markup evidenziato seguente.

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<p>Hello from our View Template!</p>

Fare clic con il pulsante destro del mouse sul file Index.cshtml e scegliere Visualizza nel browser.

PI

È anche possibile fare clic con il pulsante destro del mouse sul file Index.cshtml e selezionare Visualizza in Controllo pagina. Per altre informazioni, vedere l'esercitazione su Controllo pagina .

In alternativa, eseguire l'applicazione e passare al HelloWorld controller (http://localhost:xxxx/HelloWorld). Il Index metodo nel controller non ha funzionato molto. È stata semplicemente eseguita l'istruzione return View(), che ha specificato che il metodo deve usare un file modello di visualizzazione per eseguire il rendering di una risposta al browser. Poiché non è stato specificato in modo esplicito il nome del file del modello di visualizzazione da usare, ASP.NET MVC ha utilizzato il file di visualizzazione Index.cshtml nella cartella \Views\HelloWorld . L'immagine seguente mostra la stringa "Hello from our View Template!" inserita nel codice nella vista.

Screenshot che mostra la pagina Indice e il testo Hello dal modello di visualizzazione.

Sembra abbastanza buono. Si noti tuttavia che la barra del titolo del browser mostra "Index - My ASP.NET Application" e il collegamento grande nella parte superiore della pagina indica "Nome applicazione". A seconda delle dimensioni della finestra del browser, potrebbe essere necessario fare clic sulle tre barre in alto a destra per visualizzare i collegamenti Home, Informazioni, Contatto, Registrazione e Accesso .

Modifica delle visualizzazioni e delle pagine di layout

In primo luogo, si vuole modificare il collegamento "Nome applicazione" nella parte superiore della pagina. Questo testo è comune a ogni pagina. Viene effettivamente implementato in un'unica posizione nel progetto, anche se viene visualizzato in ogni pagina dell'applicazione. Passare alla cartella /Views/Shared in Esplora soluzioni e aprire il file _Layout.cshtml . Questo file è denominato pagina di layout e si trova nella cartella condivisa usata da tutte le altre pagine.

_LayoutCshtml

I modelli di layout consentono di specificare il layout del contenitore HTML del sito in un'unica posizione e quindi applicarlo tra più pagine nel sito. Trovare la riga @RenderBody(). RenderBody è un segnaposto in cui tutte le pagine specifiche della vista che crei vengono visualizzate, "racchiuse" nella pagina di layout. Ad esempio, se si seleziona il collegamento Informazioni , il rendering della vista Views\Home\About.cshtml viene eseguito all'interno del RenderBody metodo .

Modificare il contenuto dell'elemento title. Modificare ActionLink nel modello di layout da "Nome applicazione" a "MVC Movie" e il controller da Home a Movies. Il file di layout completo è illustrato di seguito:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@ViewBag.Title - Movie App</title>
    @Styles.Render("~/Content/css")
    @Scripts.Render("~/bundles/modernizr")

</head>
<body>
    <div class="navbar navbar-inverse navbar-fixed-top">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                @Html.ActionLink("MVC Movie", "Index", "Movies", null, new { @class = "navbar-brand" })
            </div>
            <div class="navbar-collapse collapse">
                <ul class="nav navbar-nav">
                    <li>@Html.ActionLink("Home", "Index", "Home")</li>
                    <li>@Html.ActionLink("About", "About", "Home")</li>
                    <li>@Html.ActionLink("Contact", "Contact", "Home")</li>
                </ul>
            </div>
        </div>
    </div>
    <div class="container body-content">
        @RenderBody()
        <hr />
        <footer>
            <p>&copy; @DateTime.Now.Year - My ASP.NET Application</p>
        </footer>
    </div>

    @Scripts.Render("~/bundles/jquery")
    @Scripts.Render("~/bundles/bootstrap")
    @RenderSection("scripts", required: false)
</body>
</html>

Eseguire l'applicazione e notare che ora è indicato "MVC Movie". Fare clic sul collegamento About (Informazioni) e vedrai come anche quella pagina mostri "MVC Movie". È stato possibile apportare la modifica una volta nel modello di layout e avere tutte le pagine nel sito riflettono il nuovo titolo.

Screenshot che mostra la pagina

Quando è stato creato per la prima volta il file Views\HelloWorld\Index.cshtml , contiene il codice seguente:

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

Il codice Razor precedente imposta in modo esplicito la pagina di layout. Esaminare il file Views\_ViewStart.cshtml , che contiene esattamente lo stesso markup Razor. Il file Views\_ViewStart.cshtml definisce il layout comune che verrà usato da tutte le visualizzazioni, pertanto puoi commentare o rimuovere quel codice dal file Views\HelloWorld\Index.cshtml.

@*@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}*@

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<p>Hello from our View Template!</p>

È possibile utilizzare la Layout proprietà per impostare una visualizzazione layout diversa o impostarla su null in modo che non venga usato alcun file di layout.

A questo punto, modificare il titolo della visualizzazione Indice.

Aprire MvcMovie\Views\HelloWorld\Index.cshtml. Esistono due posizioni per apportare una modifica: prima, il testo visualizzato nel titolo del browser e quindi nell'intestazione secondaria (l'elemento <h2> ). Rendile leggermente diverse per poter vedere quale parte di codice modifica quale parte dell'app.

@{
    ViewBag.Title = "Movie List";
}

<h2>My Movie List</h2>

<p>Hello from our View Template!</p>

Per indicare il titolo HTML da visualizzare, il codice precedente imposta una Title proprietà dell'oggetto ViewBag (che si trova nel modello di visualizzazione Index.cshtml ). Si noti che il modello di layout ( Views\Shared\_Layout.cshtml ) usa questo valore nell'elemento <title> come parte della <head> sezione del codice HTML modificato in precedenza.

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@ViewBag.Title - Movie App</title>
    @Styles.Render("~/Content/css")
    @Scripts.Render("~/bundles/modernizr")
</head>

Usando questo ViewBag approccio, è possibile passare facilmente altri parametri tra il modello di visualizzazione e il file di layout.

Eseguire l'applicazione. Si noti che il titolo del browser, l'intestazione primaria e le intestazioni secondarie sono cambiate. Se non vengono visualizzate modifiche nel browser, è possibile che si stia visualizzando il contenuto memorizzato nella cache. Premere CTRL+F5 nel browser per forzare il caricamento della risposta dal server. Il titolo del browser viene creato con l'oggetto ViewBag.Title impostato nel modello di visualizzazione Index.cshtml e l'ulteriore "- Movie App" aggiunto nel file di layout.

Si noti anche che il contenuto nel modello di visualizzazione Index.cshtml è stato unito al modello di visualizzazione _Layout.cshtml e una singola risposta HTML è stata inviata al browser. I modelli di layout semplificano l'applicazione delle modifiche in tutte le pagine dell'applicazione.

Screenshot che mostra la pagina MVC Movie My Movie List.

Tuttavia, un po' del nostro "dato" (in questo caso il messaggio "Hello from our View Template!") è codificato. L'applicazione MVC ha una "V" (vista) e hai un "C" (controller), ma ancora nessuna "M" (modello). A breve verrà illustrato come creare un database e recuperare i dati del modello da esso.

Passaggio di dati dal controller alla vista

Prima di passare a un database e parlare dei modelli, è necessario prima parlare del passaggio di informazioni dal controller a una visualizzazione. Le classi controller vengono richiamate in risposta a una richiesta url in ingresso. Una classe controller è la posizione in cui si scrive il codice che gestisce le richieste del browser in ingresso, recupera i dati da un database e infine decide il tipo di risposta da inviare al browser. I modelli di visualizzazione possono quindi essere usati da un controller per generare e formattare una risposta HTML al browser.

I controller sono responsabili della fornitura di dati o oggetti necessari affinché un modello di visualizzazione esegua il rendering di una risposta al browser. Procedura consigliata: un modello di visualizzazione non deve mai eseguire logica di business o interagire direttamente con un database. Al contrario, un modello di visualizzazione deve funzionare solo con i dati forniti dal controller. La gestione di questa "separazione dei problemi" consente di mantenere il codice pulito, testabile e gestibile.

Attualmente, il metodo Welcome nella classe HelloWorldController prende un parametro name e un parametro numTimes, quindi restituisce i valori direttamente al browser. Anziché fare in modo che il controller esegua il rendering di questa risposta come stringa, modificare il controller in modo da usare invece un modello di visualizzazione. Il modello di visualizzazione genererà una risposta dinamica, il che significa che è necessario passare i bit appropriati di dati dal controller alla visualizzazione per generare la risposta. A tale scopo, il controller inserisce i dati dinamici (parametri) necessari per il modello di visualizzazione in un ViewBag oggetto a cui il modello di visualizzazione può quindi accedere.

Tornare al file HelloWorldController.cs e modificare il Welcome metodo per aggiungere un Message valore e NumTimes all'oggetto ViewBag . ViewBag è un oggetto dinamico, il che significa che è possibile inserire qualsiasi elemento in esso; l'oggetto ViewBag non ha proprietà definite fino a quando non si inserisce qualcosa all'interno di esso. Il sistema di associazione di modelli MVC ASP.NET esegue automaticamente il mapping dei parametri denominati (name e numTimes) dalla stringa di query nella barra degli indirizzi ai parametri del metodo. Il file completo HelloWorldController.cs è simile al seguente:

using System.Web;
using System.Web.Mvc;

namespace MvcMovie.Controllers
{
    public class HelloWorldController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult Welcome(string name, int numTimes = 1)
        {
            ViewBag.Message = "Hello " + name;
            ViewBag.NumTimes = numTimes;

            return View();
        }
    }
}

L'oggetto ViewBag contiene ora i dati che verranno passati automaticamente alla visualizzazione. È quindi necessario un modello di vista di benvenuto! Nel menu Compila selezionare Compila soluzione (o CTRL+MAIUSC+B) per assicurarsi che il progetto sia compilato. Fare clic con il pulsante destro del mouse sulla cartella Views\HelloWorld e scegliere Aggiungi, quindi fare clic su Pagina visualizzazione MVC 5 con layout (Razor).

Screenshot che mostra la finestra Esplora soluzioni. Sono aperti il menu di scelta rapida di Hello World e il sottomenu Aggiungi. È selezionata l'opzione MVC 5 View Page with Layout Razor.

Nella finestra di dialogo Specifica nome per elemento immettere Welcome e quindi fare clic su OK.

Nella finestra di dialogo Seleziona pagina layout accettare il _Layout.cshtml predefinito e fare clic su OK.

Screenshot che mostra la pagina Seleziona un layout. La sottocartella con etichetta Shared è aperta e Layout punto c s h t m l è selezionato.

Viene creato il file MvcMovie\Views\HelloWorld\Welcome.cshtml .

Sostituire il markup nel file Welcome.cshtml . Si creerà un ciclo che indica "Hello" quante volte l'utente lo dice. Di seguito è riportato il file Welcome.cshtml completo.

@{
    ViewBag.Title = "Welcome";
}

<h2>Welcome</h2>

<ul>
    @for (int i = 0; i < ViewBag.NumTimes; i++)
    {
        <li>@ViewBag.Message</li>
    }
</ul>

Eseguire l'applicazione e passare all'URL seguente:

http://localhost:xx/HelloWorld/Welcome?name=Scott&numtimes=4

I dati vengono ora acquisiti dall'URL e passati al controller usando lo strumento di associazione di modelli. Il controller inserisce i dati in un ViewBag oggetto e passa tale oggetto alla visualizzazione. La visualizzazione visualizza quindi i dati come HTML per l'utente.

Screenshot che mostra la pagina di benvenuto di MVC Movie.

Nell'esempio precedente è stato usato un ViewBag oggetto per passare dati dal controller a una vista. Più avanti nell'esercitazione si userà un modello di visualizzazione per passare i dati da un controller a una vista. L'approccio al modello di visualizzazione per il passaggio dei dati è in genere preferibile rispetto all'approccio del contenitore di visualizzazione. Per ulteriori informazioni, vedere l'articolo del blog Dynamic V Viste Tipizzate Fortemente.

Beh, questo era un tipo di "M" per modello, ma non il tipo di database. Mettiamo in pratica ciò che abbiamo imparato e creiamo un database di film.