Come già detto, la classe System.Web.Mvc.ViewPage
da cui ereditano tutte le viste scritte per il WebForms View Engine mette a disposizione dello sviluppatore alcune proprietà molto utili.
La prima di cui ci andiamo ad occupare è Model
. Questa proprietà di tipo object
funziona da contenitore per i dati che la vista dovrà mostrare all'utente. Il compito di inserire i dati in questa proprietà, come in altre che vedremo tra poco, spetta al controller.
Riprendiamo il codice del controller GalleryController
relativo all'azione Index:
Azione Index di GalleryController
public ViewResult Index() { // Estraggo la lista delle immagini dal database GalleryDataContext context = new GalleryDataContext(); List<GalleryImage> images = context.GetImages(); // Richiamo la vista corrispondente all'azione // In questo caso la vista mostrerà la lista delle immagini return View(images); }
Il codice all'interno del metodo estrae la lista delle immagini dal database e la passa poi alla vista corrispondente attraverso una chiamata al metodo View
. Questi dati verranno memorizzati nella proprietà Model
della nostra vista.
Sarà quindi possibile utilizzare i dati all'interno della view:
Vista relativa all'azione Index di GalleryController
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %> ... <!-- Corpo della pagina --> <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> ... <% // Effettuo il cast per ottenere una lista dalla proprietà Model // (di tipo object) var images = (List<GalleryImage>)(this.Model); // Se nella lista sono presenti immagini le visualizzo if (images.Count > 0) { %> <ul class="gallery"> <% // Stampo la descrizione per ogni immagine foreach (var image in images) { %> ... <% } %> </ul> <% } else // Altrimenti mostro un messaggio di errore { %> <p>Nessuna immagine presente nel database.</p> <% } %> </asp:Content>
Per maggior chiarezza, nel listato precedente abbiamo omesso alcune porzioni di codice. Dato che la proprietà Model è definita come object
, abbiamo bisogno di effettuare una cast a List<GalleryImage>
per accedere ai dati:
// Effettuo il cast per ottenere una lista dalla proprietà Model (di tipo object)
var images = (List<GalleryImage>)(this.Model);
Come vedremo nella prossima lezione è possibile evitare questo passaggio superfluo (e dispendioso per quanto riguarda le risorse impiegate) utilizzando viste con Model fortemente tipizzato.
Una volta ottenuta la lista delle immagini, le mostro a video utilizzando un ciclo foreach
oppure visualizzo un messaggio di errore nel caso in cui la lista sia vuota.
Questo è il risultato: