Per visualizzare l'articolo in inglese, selezionare la casella di controllo Inglese. È possibile anche visualizzare il testo inglese in una finestra popup posizionando il puntatore del mouse sopra il testo.
Traduzione
Inglese

Controller e metodi di azione nelle applicazioni ASP.NET MVC

Il framework di MVC ASP.NET esegue il mapping degli URL alle classi definite controller. I controller elaborano le richieste in ingresso, gestiscono l'input e le interazioni dell'utente ed eseguono la logica dell'applicazione appropriata. Una classe controller chiama in genere un componente di visualizzazione separato per generare il markup HTML per la richiesta.

La classe di base per tutti i controller è la classe ControllerBase, che consente la gestione di MVC in generale. La classe Controller eredita da ControllerBase e rappresenta l'implementazione predefinita di un controller. La classe Controller è responsabile delle fasi di elaborazione seguenti:

  • Individuazione del metodo di azione appropriato da chiamare e verifica che il metodo di azione possa essere chiamato.

  • Acquisizione dei valori da utilizzare come argomenti del metodo di azione.

  • Gestione di tutti gli errori che potrebbero verificarsi durante l'esecuzione del metodo di azione.

  • Specifica della classe WebFormViewEngine predefinita per il rendering dei tipi di pagina ASP.NET (visualizzazioni).

    NotaNota:

    Per proteggere l'accesso a controller e metodi di azione, è possibile utilizzare la classe AuthorizeAttribute.

Tutte le classi controller devono essere denominate con il suffisso "Controller". Nell'esempio seguente viene illustrata la classe controller denominata HomeController che contiene metodi di azione che eseguono il rendering di pagine di visualizzazione.


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

        return View();
    }

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


Nelle applicazioni ASP.NET che non utilizzano il framework di MVC l'interazione dell'utente è organizzata intorno alle pagine, nonché intorno alla generazione e alla gestione di eventi dalla pagina e dai controlli nella pagina. Al contrario, l'interazione dell'utente con le applicazioni MVC ASP.NET è organizzata intorno a controller e metodi di azione. Il controller definisce i metodi di azione. I controller possono includere tutti i metodi di azione necessari.

I metodi di azione presentano in genere un mapping uno-a-uno con le interazioni dell'utente. Alcuni esempi di interazioni dell'utente sono l'immissione di un URL nel browser, la selezione di un collegamento e l'invio di un modulo. Ogni interazione dell'utente causa l'invio di una richiesta al server. In tutti i casi, nell'URL della richiesta sono incluse informazioni che vengono utilizzate dal framework di MVC per richiamare un metodo di azione.

Quando un utente immette un URL nel browser, l'applicazione MVC utilizza le regole di routing definite nel file Global.asax per analizzare l'URL e determinare il percorso del controller. Il controller determina quindi il metodo di azione appropriato per gestire la richiesta. Per impostazione predefinita, l'URL di una richiesta viene considerato come un sottopercorso che contiene il nome del controller seguito dal nome dell'azione. Ad esempio, se un utente immette l'URL http://contoso.com/MyWebSite/Products/Categories, il sottopercorso corrisponde a /Products/Categories. La regola di routing predefinita considera "Products" come prefisso del controller che deve terminare con "Controller", ad esempio ProductsController, e "Categories" come nome dell'azione. La regola di routing richiama pertanto il metodo Categories del controller Products in modo da elaborare la richiesta. Se l'URL termina con /Products/Detail/5, la regola di routing predefinita considera "Detail" come nome dell'azione e viene richiamato il metodo Detail del controller Products per elaborare la richiesta. Per impostazione predefinita, il valore "5" nell'URL verrà passato al metodo Detail come parametro.

Nell'esempio seguente viene illustrata una classe controller che dispone di un metodo di azione HelloWorld.

public class MyController : Controller
{
    public ActionResult HelloWorld()
    {
        ViewData["Message"] = "Hello World!";
        return View();
    }
}

La maggior parte dei metodi di azione restituisce un'istanza di una classe che deriva da ActionResult. La classe ActionResult costituisce la base per tutti i risultati dell'azione. Esistono tuttavia tipi di risultati dell'azione diversi, a seconda dell'attività eseguita dal metodo di azione. L'azione più comune è ad esempio la chiamata del metodo View. Il metodo View restituisce un'istanza della classe ViewResult derivata da ActionResult.

È possibile creare metodi di azione che restituiscono un oggetto di qualsiasi tipo, ad esempio una stringa oppure un valore intero o booleano. Di questi tipi restituiti viene eseguito il wrapping in un tipo ActionResult appropriato prima che ne venga eseguito il rendering nel flusso di risposte.

Nella tabella seguente vengono illustrati i tipi di risultati dell'azione incorporati e i metodi di supporto all'azione che li restituiscono.

Risultato dell'azione

Metodo di supporto

Descrizione

ViewResult

View

Esegue il rendering di una visualizzazione come pagina Web.

PartialViewResult

PartialView

Esegue il rendering di una visualizzazione parziale che definisce una sezione di una visualizzazione di cui può essere eseguito il rendering in un'altra visualizzazione.

RedirectResult

Redirect

Reindirizza a un altro metodo di azione tramite l'URL corrispondente.

RedirectToRouteResult

RedirectToAction

RedirectToRoute

Reindirizza a un altro metodo di azione.

ContentResult

Content

Restituisce un tipo di contenuto definito dall'utente.

JsonResult

Json

Restituisce un oggetto JSON serializzato.

JavaScriptResult

JavaScript

Restituisce uno script che può essere eseguito nel client.

FileResult

File

Restituisce un output binario da scrivere nella risposta.

EmptyResult

(Nessuno)

Rappresenta un valore restituito che viene utilizzato quando il metodo di azione deve restituire un risultato null (void).

Per impostazione predefinita, il framework di MVC considera tutti i metodi pubblici di una classe controller come metodi di azione. Se la classe controller contiene un metodo pubblico che non si desidera corrisponda a un metodo di azione, è necessario contrassegnare tale metodo con l'attributo NonActionAttribute.

Nell'esempio seguente viene illustrato un metodo contrassegnato con l'attributo NonAction.

[NonAction]
private void DoSomething()
{
    // Method logic.
}

Per impostazione predefinita, i valori per i parametri dei metodi di azione vengono recuperati dalla raccolta di dati della richiesta. Nella raccolta di dati sono incluse coppie di nome/valore per i dati del form, i valori delle stringhe di query e valori dei cookie.

La classe controller individua il metodo di azione e determina i valori dei parametri per il metodo di azione in base all'istanza di RouteData e ai dati del form. Se non è possibile analizzare il valore del parametro e se il tipo del parametro è un tipo di riferimento o un tipo di valore nullable, viene passato null come valore del parametro. In caso contrario, viene generata un'eccezione.

È possibile accedere ai valori di parametro degli URL nei metodi di azione delle classi controller in modi diversi. La classe Controller espone le proprietà Request e Response alle quali è possibile accedere in un metodo di azione. Queste proprietà utilizzano la stessa semantica degli oggetti HttpRequest e HttpResponse che fanno già parte di ASP.NET. Tuttavia, anziché essere classi sealed, gli oggetti Request e Response della classe Controller accettano oggetti che implementano le classi astratte HttpRequestBase e HttpResponseBase. Queste classi di base consentono di creare con facilità oggetti fittizi, che a loro volta semplificano la creazione di unit test per classi controller.

Nell'esempio seguente viene illustrato come utilizzare l'oggetto Request per recuperare un valore della stringa di query denominato id.

public void Detail()
{
    int id = Convert.ToInt32(Request["id"]);
}

Il framework di MVC ASP.NET può eseguire automaticamente il mapping di valori di parametri degli URL a valori di parametro per i metodi di azione. Per impostazione predefinita, se un metodo di azione accetta un parametro, il framework di MVC esamina i dati della richiesta in ingresso e determina se la richiesta contiene un valore della richiesta HTTP con lo stesso nome. In caso affermativo, il valore della richiesta viene passato automaticamente al metodo di azione.

Nell'esempio seguente viene illustrata una variante dell'esempio precedente in cui si presuppone che il parametro id sia mappato a un valore della richiesta anch'esso denominato id. Grazie a questo mapping automatico, non è necessario che il metodo di azione includa il codice che consente di ottenere un valore di parametro dalla richiesta e il valore di parametro risulta pertanto più facile da utilizzare.

public ResultAction Detail(int id)
{
    ViewData["DetailInfo"] = id;
    return View();
}

È inoltre possibile incorporare valori di parametro come parte dell'URL, anziché come valori della stringa di query. Ad esempio, anziché utilizzare l'URL con una stringa di query quale /Products/Detail?id=3, è possibile utilizzare un URL come /Products/Detail/3. La regola per il mapping delle route predefinita ha il formato /{controller}/{action}/{id}. Se è presente un sottopercorso dell'URL dopo i nomi del controller e dell'azione, questo viene considerato come un parametro denominato id e viene passato automaticamente al metodo di azione come valore di parametro.

Il framework di MVC supporta inoltre argomenti facoltativi per i metodi di azione. I parametri facoltativi nel framework di MVC vengono gestiti tramite argomenti di tipo nullable per i metodi di azione del controller. Ad esempio, se un metodo può accettare una data come parte della stringa di query ma si desidera che l'impostazione predefinita corrisponda alla data odierna quando il parametro della stringa di query è mancante, è possibile utilizzare il codice analogo a quello riportato nell'esempio seguente:

public ActionResult ShowArticles(DateTime? date)
{
    if(!date.HasValue)
    {
        date = DateTime.Now;
    }
    // ...
}

Se nella richiesta è incluso un valore per il parametro di data, tale valore viene passato al metodo ShowArticles. Se nella richiesta non è incluso un valore per questo parametro, l'argomento è null e il controller può intraprendere qualsiasi azione necessaria per gestire il parametro mancante.

Mostra: