Panoramica del controller ASP.NET MVC (C#)

di Stephen Walther

In questa esercitazione Stephen Walther presenta ASP.NET controller MVC. Si apprenderà come creare nuovi controller e restituire diversi tipi di risultati dell'azione.

Questa esercitazione illustra l'argomento relativo ASP.NET controller MVC, azioni del controller e risultati delle azioni. Al termine di questa esercitazione, si comprenderà come vengono usati i controller per controllare il modo in cui un visitatore interagisce con un sito Web ASP.NET MVC.

Informazioni sui controller

I controller MVC sono responsabili della risposta alle richieste effettuate su un sito Web MVC ASP.NET. Ogni richiesta del browser viene mappata a un controller specifico. Si supponga, ad esempio, di immettere l'URL seguente nella barra degli indirizzi del browser:

http://localhost/Product/Index/3

In questo caso viene richiamato un controller denominato ProductController. ProductController è responsabile della generazione della risposta alla richiesta del browser. Ad esempio, il controller potrebbe restituire una visualizzazione specifica al browser o il controller potrebbe reindirizzare l'utente a un altro controller.

L'elenco 1 contiene un controller semplice denominato ProductController.

Listing1 - Controllers\ProductController.cs

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

namespace MvcApplication1.Controllers
{
    public class ProductController : Controller
    {
        //
        // GET: /Products/

        public ActionResult Index()
        {
            // Add action logic here
            return View();
        }
    }
}

Come si può vedere nell'elenco 1, un controller è solo una classe (una classe .NET o C#di Visual Basic). Un controller è una classe che deriva dalla classe System.Web.Mvc.Controller di base. Poiché un controller eredita da questa classe di base, un controller eredita gratuitamente diversi metodi utili (questi metodi vengono illustrati in un momento).

Informazioni sulle azioni del controller

Un controller espone le azioni del controller. Un'azione è un metodo su un controller che viene chiamato quando si immette un URL specifico nella barra degli indirizzi del browser. Si supponga, ad esempio, di effettuare una richiesta per l'URL seguente:

http://localhost/Product/Index/3

In questo caso, il metodo Index() viene chiamato sulla classe ProductController. Il metodo Index() è un esempio di azione del controller.

Un'azione del controller deve essere un metodo pubblico di una classe controller. I metodi C#, per impostazione predefinita, sono metodi privati. Tenere presente che qualsiasi metodo pubblico aggiunto a una classe controller viene esposto automaticamente come azione del controller (è necessario prestare attenzione a questo perché un'azione del controller può essere richiamata da chiunque nell'universo semplicemente digitando l'URL corretto in una barra degli indirizzi del browser).

Esistono alcuni requisiti aggiuntivi che devono essere soddisfatti da un'azione del controller. Non è possibile eseguire l'overload di un metodo utilizzato come azione del controller. Inoltre, un'azione del controller non può essere un metodo statico. A parte questo, è possibile usare solo qualsiasi metodo come azione del controller.

Informazioni sui risultati dell'azione

Un'azione del controller restituisce un valore denominato risultato di un'azione. Un risultato dell'azione è ciò che viene restituito da un'azione del controller in risposta a una richiesta del browser.

Il framework MVC ASP.NET supporta diversi tipi di risultati delle azioni, tra cui:

  1. ViewResult: rappresenta html e markup.
  2. EmptyResult: non rappresenta alcun risultato.
  3. RedirectResult: rappresenta un reindirizzamento a un nuovo URL.
  4. JsonResult: rappresenta un risultato della notazione di oggetti JavaScript che può essere usato in un'applicazione AJAX.
  5. JavaScriptResult: rappresenta uno script JavaScript.
  6. ContentResult: rappresenta un risultato di testo.
  7. FileContentResult: rappresenta un file scaricabile (con il contenuto binario).
  8. FilePathResult : rappresenta un file scaricabile (con un percorso).
  9. FileStreamResult: rappresenta un file scaricabile (con un flusso di file).

Tutti questi risultati dell'azione ereditano dalla classe ActionResult di base.

Nella maggior parte dei casi, un'azione del controller restituisce viewResult. Ad esempio, l'azione Controller di indice in Listato 2 restituisce un elemento ViewResult.

Elenco 2 - Controllers\BookController.cs

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

namespace MvcApplication1.Controllers
{
    public class BookController : Controller
    {
        public ActionResult Index()
        {
            // Add action logic here
            return View();
        }
    }
}

Quando un'azione restituisce viewResult, il codice HTML viene restituito al browser. Il metodo Index() in Listing 2 restituisce una vista denominata Index nel browser.

Si noti che l'azione Index() nell'elenco 2 non restituisce viewResult(). Viene invece chiamato il metodo View() della classe base Controller. In genere, non si restituisce direttamente un risultato dell'azione. Chiamare invece uno dei metodi seguenti della classe base Controller:

  1. View: restituisce un risultato dell'azione ViewResult.
  2. Reindirizzamento: restituisce un risultato dell'azione RedirectResult.
  3. RedirectToAction: restituisce un risultato dell'azione RedirectToRouteResult.
  4. RedirectToRoute: restituisce un risultato dell'azione RedirectToRouteResult.
  5. Json: restituisce un risultato dell'azione JsonResult.
  6. JavaScriptResult: restituisce un oggetto JavaScriptResult.
  7. Contenuto: restituisce un risultato dell'azione ContentResult.
  8. File: restituisce un oggetto FileContentResult, FilePathResult o FileStreamResult a seconda dei parametri passati al metodo.

Pertanto, se si desidera restituire un oggetto View al browser, chiamare il metodo View(). Se si vuole reindirizzare l'utente da un'azione del controller a un'altra, chiamare il metodo RedirectToAction(). Ad esempio, l'azione Details() nell'elenco 3 visualizza una visualizzazione o reindirizza l'utente all'azione Index() a seconda che il parametro Id abbia un valore.

Elenco 3 - CustomerController.cs

using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    public class CustomerController : Controller
    {
        public ActionResult Details(int? id)
        {
            if (!id.HasValue)
                return RedirectToAction("Index");

            return View();
        }

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

    }
}

Il risultato dell'azione ContentResult è speciale. È possibile utilizzare il risultato dell'azione ContentResult per restituire un risultato dell'azione come testo normale. Ad esempio, il metodo Index() in Listing 4 restituisce un messaggio come testo normale e non come HTML.

Elenco 4 - Controllers\StatusController.cs

using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    public class StatusController : Controller
    {
        public ActionResult Index()
        {
            return Content("Hello World!");
        }
    }
}

Quando viene richiamata l'azione StatusController.Index(), non viene restituita una visualizzazione. Al contrario, il testo non elaborato "Hello World!" viene restituito al browser.

Se un'azione del controller restituisce un risultato che non è un risultato dell'azione, ad esempio una data o un numero intero, il risultato viene eseguito automaticamente in un oggetto ContentResult. Ad esempio, quando viene richiamata l'azione Index() di WorkController nell'elenco 5, la data viene restituita automaticamente come ContentResult.

Listato 5 - WorkController.cs

using System;
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    public class WorkController : Controller
    {
        public DateTime Index()
        {
            return DateTime.Now;
        }
    }
}

L'azione Index() in Listato 5 restituisce un oggetto DateTime. Il framework MVC ASP.NET converte l'oggetto DateTime in una stringa ed esegue automaticamente il wrapping del valore DateTime in un oggetto ContentResult. Il browser riceve la data e l'ora come testo normale.

Riepilogo

Lo scopo di questa esercitazione è stato quello di presentare i concetti di ASP.NET controller MVC, azioni del controller e risultati delle azioni del controller. Nella prima sezione si è appreso come aggiungere nuovi controller a un progetto MVC ASP.NET. Successivamente, si è appreso come i metodi pubblici di un controller vengono esposti all'universo come azioni del controller. Infine, sono stati illustrati i diversi tipi di risultati dell'azione che possono essere restituiti da un'azione del controller. In particolare, è stato illustrato come restituire un oggetto ViewResult, RedirectToActionResult e ContentResult da un'azione del controller.