Gestire le richieste con controller in ASP.NET Core MVCHandle requests with controllers in ASP.NET Core MVC

Steve Smith e Scott AddieBy Steve Smith and Scott Addie

I controller, le azioni e risultati delle azioni sono parti fondamentali dello sviluppo di app tramite ASP.NET Core MVC.Controllers, actions, and action results are a fundamental part of how developers build apps using ASP.NET Core MVC.

Che cos'è un controller?What is a Controller?

Un controller viene usato per definire e raggruppare un set di azioni.A controller is used to define and group a set of actions. Un'azione (o metodo di azione) è un metodo in un controller che gestisce richieste.An action (or action method) is a method on a controller which handles requests. I controller raggruppano azioni simili in modo logico.Controllers logically group similar actions together. Questa aggregazione di azioni consente l'applicazione collettiva di set di regole comuni, ad esempio routing, memorizzazione nella cache e autorizzazione.This aggregation of actions allows common sets of rules, such as routing, caching, and authorization, to be applied collectively. Le richieste vengono mappate alle azioni tramite routing.Requests are mapped to actions through routing.

Per convenzione, le classi controller:By convention, controller classes:

  • Si trova nella cartella controller a livello radice del progetto.Reside in the project's root-level Controllers folder.
  • Ereditare da Microsoft.AspNetCore.Mvc.Controller.Inherit from Microsoft.AspNetCore.Mvc.Controller.

Un controller è una classe istanziabile per cui almeno una delle condizioni seguenti è vera:A controller is an instantiable class in which at least one of the following conditions is true:

  • Il nome della classe è suffisso con Controller.The class name is suffixed with Controller.
  • La classe eredita da una classe il cui nome è suffisso con Controller.The class inherits from a class whose name is suffixed with Controller.
  • L'attributo [Controller] viene applicato alla classe.The [Controller] attribute is applied to the class.

A una classe controller non deve essere associato un attributo [NonController].A controller class must not have an associated [NonController] attribute.

I controller devono seguire il principio delle dipendenze esplicite.Controllers should follow the Explicit Dependencies Principle. Per l'implementazione di questo principio esistono due approcci.There are a couple of approaches to implementing this principle. Se più azioni del controller richiedono lo stesso servizio, prendere in considerazione l'uso dell'inserimento di costruttori per richiedere tali dipendenze.If multiple controller actions require the same service, consider using constructor injection to request those dependencies. Se il servizio è richiesto da un solo metodo di azione, prendere in considerazione l'uso dell'inserimento di azioni per richiedere la dipendenza.If the service is needed by only a single action method, consider using Action Injection to request the dependency.

All'interno del modello Model-View-Controller, un controller è responsabile dell'elaborazione iniziale della richiesta e della creazione di istanze del modello.Within the Model-View-Controller pattern, a controller is responsible for the initial processing of the request and instantiation of the model. In genere, per le decisioni aziendali è consigliabile seguire il modello.Generally, business decisions should be performed within the model.

Il controller riceve il risultato di un'eventuale elaborazione del modello e restituisce la visualizzazione corretta e i dati associati oppure il risultato della chiamata API.The controller takes the result of the model's processing (if any) and returns either the proper view and its associated view data or the result of the API call. Per altre informazioni, vedere Panoramica di ASP.NET Core MVC e Introduzione ad ASP.NET Core MVC e Visual Studio.Learn more at Overview of ASP.NET Core MVC and Get started with ASP.NET Core MVC and Visual Studio.

Il controller è un'astrazione a livello di interfaccia utente.The controller is a UI-level abstraction. Il suo compito è di verificare che i dati della richiesta siano validi e di scegliere la visualizzazione (o il risultato per un'API) da restituire.Its responsibilities are to ensure request data is valid and to choose which view (or result for an API) should be returned. Nelle app con factoring corretto, il controller non include direttamente accesso ai dati o logica di business,In well-factored apps, it doesn't directly include data access or business logic. ma delega la gestione di tali responsabilità a servizi specifici.Instead, the controller delegates to services handling these responsibilities.

Definizione delle azioniDefining Actions

I metodi pubblici in un controller, ad eccezione di quelli con l'attributo [NonAction], sono azioni.Public methods on a controller, except those with the [NonAction] attribute, are actions. I parametri delle azioni sono associati a dati di richiesta e vengono convalidati tramite associazione di modelli.Parameters on actions are bound to request data and are validated using model binding. La convalida del modello viene eseguita per tutto ciò che è associato a un modello.Model validation occurs for everything that's model-bound. Il valore della proprietà ModelState.IsValid indica se l'associazione e la convalida dei modelli hanno avuto esito positivo.The ModelState.IsValid property value indicates whether model binding and validation succeeded.

I metodi di azione devono contenere la logica per il mapping di una richiesta a un problema di business.Action methods should contain logic for mapping a request to a business concern. È di solito consigliabile rappresentare i problemi di business come servizi a cui il controller accede tramite inserimento di dipendenze.Business concerns should typically be represented as services that the controller accesses through dependency injection. Le azioni eseguono quindi il mapping del risultato dell'azione di business a uno stato dell'applicazione.Actions then map the result of the business action to an application state.

Le azioni possono restituire qualsiasi valore, ma spesso restituiscono un'istanza di IActionResult (o di Task<IActionResult> per i metodi asincroni) che genera una risposta.Actions can return anything, but frequently return an instance of IActionResult (or Task<IActionResult> for async methods) that produces a response. Il metodo di azione è responsabile della scelta del tipo di risposta.The action method is responsible for choosing what kind of response. Il risultato dell'azione esegue la risposta.The action result does the responding.

Metodi helper dei controllerController Helper Methods

I controller in genere ereditano dalla classe Controller, anche se questo non è obbligatorio.Controllers usually inherit from Controller, although this isn't required. La derivazione da Controller consente l'accesso a tre categorie di metodi helper:Deriving from Controller provides access to three categories of helper methods:

1. metodi che derivano da un corpo della risposta vuoto1. Methods resulting in an empty response body

Non è inclusa un'intestazione di risposta HTTP Content-Type, poiché il corpo della risposta non ha contenuto da descrivere.No Content-Type HTTP response header is included, since the response body lacks content to describe.

All'interno di questa categoria sono presenti due tipi di risultati: reindirizzamento e codice di stato HTTP.There are two result types within this category: Redirect and HTTP Status Code.

  • Codice di stato HTTPHTTP Status Code

    Questo tipo restituisce un codice di stato HTTP.This type returns an HTTP status code. Alcuni metodi helper di questo tipo sono BadRequest, NotFound e Ok.A couple of helper methods of this type are BadRequest, NotFound, and Ok. Il metodo return BadRequest();, ad esempio, quando viene eseguito genera un codice di stato 400.For example, return BadRequest(); produces a 400 status code when executed. Quando metodi come BadRequest, NotFound e Ok vengono sottoposti a overload, non sono più risponditori del codice di stato HTTP, poiché è in corso la negoziazione del contenuto.When methods such as BadRequest, NotFound, and Ok are overloaded, they no longer qualify as HTTP Status Code responders, since content negotiation is taking place.

  • ReindirizzamentoRedirect

    Questo tipo restituisce un reindirizzamento a un'azione o a una destinazione (tramite Redirect, LocalRedirect, RedirectToAction o RedirectToRoute).This type returns a redirect to an action or destination (using Redirect, LocalRedirect, RedirectToAction, or RedirectToRoute). return RedirectToAction("Complete", new {id = 123});, ad esempio, reindirizza a Complete, passando un oggetto anonimo.For example, return RedirectToAction("Complete", new {id = 123}); redirects to Complete, passing an anonymous object.

    Il tipo di risultato del reindirizzamento è diverso dal tipo del codice di stato HTTP principalmente per l'aggiunta di una intestazione della risposta HTTP Location.The Redirect result type differs from the HTTP Status Code type primarily in the addition of a Location HTTP response header.

2. metodi che derivano da un corpo della risposta non vuoto con un tipo di contenuto predefinito2. Methods resulting in a non-empty response body with a predefined content type

La maggior parte dei metodi helper di questa categoria includono una proprietà ContentType, che consente di impostare l'intestazione della risposta Content-Type in modo da descrivere il corpo della risposta.Most helper methods in this category include a ContentType property, allowing you to set the Content-Type response header to describe the response body.

All'interno di questa categoria sono presenti due tipi di risultato: visualizzazione e risposta formattata.There are two result types within this category: View and Formatted Response.

  • VisualizzazioneView

    Questo tipo restituisce una visualizzazione che esegue il rendering HTML usando un modello.This type returns a view which uses a model to render HTML. return View(customer);, ad esempio, passa un modello alla visualizzazione per eseguire il data binding.For example, return View(customer); passes a model to the view for data-binding.

  • Risposta formattataFormatted Response

    Questo tipo restituisce il formato JSON o un formato di scambio di dati simile per rappresentare un oggetto in un modo specifico.This type returns JSON or a similar data exchange format to represent an object in a specific manner. return Json(customer);, ad esempio, serializza l'oggetto specificato in formato JSON.For example, return Json(customer); serializes the provided object into JSON format.

    Altri metodi comuni di questo tipo sono File e PhysicalFile.Other common methods of this type include File and PhysicalFile. Ad esempio, return PhysicalFile(customerFilePath, "text/xml"); restituisce PhysicalFileResult.For example, return PhysicalFile(customerFilePath, "text/xml"); returns PhysicalFileResult.

3. metodi che derivano da un corpo della risposta non vuoto formattato in un tipo di contenuto negoziato con il client3. Methods resulting in a non-empty response body formatted in a content type negotiated with the client

Questa categoria è più nota come negoziazione del contenuto.This category is better known as Content Negotiation. La negoziazione del contenuto si applica ogni volta che un'azione restituisce un tipo ObjectResult o qualcosa di diverso da un'implementazione di IActionResult.Content negotiation applies whenever an action returns an ObjectResult type or something other than an IActionResult implementation. Anche un'azione che restituisce un'implementazione non di IActionResult (ad esempio, object) restituisce una risposta formattata.An action that returns a non-IActionResult implementation (for example, object) also returns a Formatted Response.

Alcuni metodi helper di questo tipo sono BadRequest, CreatedAtRoute e Ok.Some helper methods of this type include BadRequest, CreatedAtRoute, and Ok. Alcuni esempi di questi metodi sono, rispettivamente, return BadRequest(modelState);, return CreatedAtRoute("routename", values, newobject); e return Ok(value);.Examples of these methods include return BadRequest(modelState);, return CreatedAtRoute("routename", values, newobject);, and return Ok(value);, respectively. Si noti che BadRequest e Ok eseguono la negoziazione del contenuto solo quando viene passato loro un valore. Se non viene loro passato alcun valore, fungono invece da tipi di risultato codice di stato HTTP.Note that BadRequest and Ok perform content negotiation only when passed a value; without being passed a value, they instead serve as HTTP Status Code result types. Il metodo CreatedAtRoute, d'altra parte, esegue sempre la negoziazione del contenuto, perché tutti gli overload di questo metodo richiedono che venga passato un valore.The CreatedAtRoute method, on the other hand, always performs content negotiation since its overloads all require that a value be passed.

Problemi di montaggio incrociatoCross-Cutting Concerns

Le applicazioni condividono in genere parti del flusso di lavoro.Applications typically share parts of their workflow. Tra gli esempi possibili, un'app che richiede l'autenticazione per accedere al carrello o un'app che memorizza nella cache i dati di alcune pagine.Examples include an app that requires authentication to access the shopping cart, or an app that caches data on some pages. Per eseguire della logica prima o dopo un metodo di azione, usare un filtro.To perform logic before or after an action method, use a filter. L'uso di filtri su problemi di montaggio incrociato può ridurre la duplicazione.Using Filters on cross-cutting concerns can reduce duplication.

La maggior parte degli attributi di filtro, ad esempio [Authorize], può essere applicata a livello di controller o di azione, a seconda del livello di granularità desiderato.Most filter attributes, such as [Authorize], can be applied at the controller or action level depending upon the desired level of granularity.

La gestione degli errori e la memorizzazione nella cache delle risposte rappresentano spesso problemi di montaggio incrociato:Error handling and response caching are often cross-cutting concerns:

Molti problemi di montaggio incrociato possono essere gestiti tramite filtri o middleware personalizzato.Many cross-cutting concerns can be handled using filters or custom middleware.