Come passare parametri ai metodi di azione in ASP.NET Core MVC

ASP.NET Core è un framework multipiattaforma, open source, snello, veloce e modulare per la creazione di applicazioni Web ad alte prestazioni. Esistono diversi modi in cui è possibile passare parametri ai metodi di azione in ASP.NET Core MVC. Puoi trasmetterli tramite un URL, una stringa di query, un'intestazione della richiesta, un corpo della richiesta o persino un modulo. Questo articolo parla di tutti questi modi e li illustra con esempi di codice.

Per lavorare con gli esempi di codice forniti in questo articolo, dovresti avere Visual Studio 2019 installato nel tuo sistema. Se non hai già una copia, puoi scaricare Visual Studio 2019 qui. 

Creare un progetto MVC ASP.NET Core in Visual Studio 2019

Prima di tutto, creiamo un progetto ASP.NET Core in Visual Studio 2019. Supponendo che Visual Studio 2019 sia installato nel tuo sistema, segui i passaggi descritti di seguito per creare un nuovo progetto ASP.NET Core in Visual Studio.

  1. Avvia l'IDE di Visual Studio.
  2. Fai clic su "Crea nuovo progetto".
  3. Nella finestra "Crea nuovo progetto", seleziona "Applicazione Web ASP.NET Core" dall'elenco dei modelli visualizzati.
  4. Fare clic su Avanti.
  5. Nella finestra "Configura il tuo nuovo progetto", specifica il nome e la posizione per il nuovo progetto.
  6. Facoltativamente, selezionare la casella di controllo "Posiziona soluzione e progetto nella stessa directory", a seconda delle preferenze.
  7. Fare clic su Crea.
  8. Nella finestra "Crea una nuova applicazione Web ASP.NET Core" mostrata di seguito, seleziona .NET Core come runtime e ASP.NET Core 3.1 (o successivo) dall'elenco a discesa in alto.
  9. Selezionare "Applicazione Web (Model-View-Controller)" come modello di progetto per creare una nuova applicazione ASP.NET Core MVC. 
  10. Assicurati che le caselle di controllo "Abilita supporto Docker" e "Configura per HTTPS" siano deselezionate poiché non utilizzeremo queste funzionalità qui.
  11. Assicurati che l'autenticazione sia impostata su "Nessuna autenticazione" poiché non utilizzeremo nemmeno l'autenticazione.
  12. Fare clic su Crea.

Seguendo questi passaggi è necessario creare un nuovo progetto ASP.NET Core MVC in Visual Studio 2019. Useremo questo progetto nelle sezioni seguenti per illustrare i vari metodi di passaggio di parametri ai metodi di azione in ASP.NET Core 3.1.

Creare una classe AuthorRepository in ASP.NET Core MVC

In questo esempio utilizzeremo una classe di repository: i metodi di azione nel controller interagiranno con i metodi della classe di repository per le operazioni CRUD. Per prima cosa creeremo una classe modello denominata Author con proprietà minime per motivi di semplicità, come mostrato nello snippet di codice riportato di seguito.

    public class Autore

    {

        public int Id {get; impostato; }

        stringa pubblica FirstName {get; impostato; }

        stringa pubblica LastName {get; impostato; }

    }

La classe AuthorRepository contiene metodi per recuperare istanze della classe Author da un elenco generico, nonché per aggiungere nuove istanze della classe Author all'elenco generico. Il metodo GetAuthors restituisce una pagina di dati, il numero di pagina viene passato ad essa come argomento.

    classe pubblica AuthorRepository

    {

        Elenca autori = nuova lista ()

        {

            nuovo autore

            {

                Id = 1,

                FirstName = "Joydip",

                LastName = "Kanjilal"

            },

            nuovo autore

            {

                Id = 2,

                FirstName = "Steve",

                LastName = "Smith"

            }

        };

        public Author GetAuthor (int id)

        {

            restituire autori.FirstOrDefault (a => a.Id == id);

        }

        public List GetAuthors (int pageNumber = 1)

        {

            int pageSize = 10;

            int skip = pageSize * (pageNumber - 1);

            if (autori.Count <pageSize)

                pageSize = autori.Count;

            autori di ritorno

              .Skip (salta)

              .Take (pageSize) .ToList ();

        }

        public bool Save (Autore dell'autore)

        {

            var risultato = autori.Where (a => a.Id == autore.Id);

            if (risultato! = null)

            {

                if (result.Count () == 0)

                {

                    autori.Add (autore);

                    restituire vero;

                }

            }

            return false;

        }

    }

Passare i parametri tramite l'URL in ASP.NET Core MVC

Uno dei modi più semplici e facili per passare i parametri a un metodo di azione è passarlo tramite l'URL. Il seguente frammento di codice illustra come passare parametri nell'URL.

[HttpGet]

[Route ("Default / GetAuthor / {authorId: int}")]

public IActionResult GetAuthor (int authorId)

{

   var data = authorRepository.GetAuthor (authorId);

   ritorno Visualizza (dati);

}

L'URL dell'endpoint è:

GET: // localhost: 8061 / Default / GetAuthor / 1

Passare i parametri tramite la stringa di query in ASP.NET Core MVC

Il passaggio di parametri nella stringa di query è un'altra opzione. Non richiede la modifica delle informazioni di instradamento e quindi è compatibile con le versioni precedenti. Considera il seguente frammento di codice che illustra come passare parametri tramite stringhe di query in un metodo di azione.

[HttpGet]

[Route ("Default / GetAuthors / {pageNumber: int}")]

public IActionResult GetAuthors ([FromQuery

(Name = "pageNumber")] int pageNumber = 1)

{

   var data = authorRepository.GetAuthors (pageNumber);

   ritorno Ok (dati);

}

Ecco l'URL per accedere a questo endpoint:

GET: // localhost: 8061 / Default / GetAuthors? PageNumber = 1

Il metodo GetAuthors accetta il numero di pagina come argomento inviato tramite stringa di query. Si noti che pageNumber è un parametro facoltativo: se non viene passato alcun parametro a questo metodo, il numero di pagina verrà interpretato come 1. Il metodo restituisce i record dell'autore per la pagina specificata. Nel nostro esempio, se ci sono 100 record dell'autore nell'archivio dati e il numero di pagina è 3, questo metodo restituirebbe i record da 31 a 40 (si noti che il numero di autori per pagina è hardcoded; è specificato come 10 nel Classe AuthorRepository.)

Passare i parametri tramite l'intestazione della richiesta in ASP.NET Core MVC

L'intestazione della richiesta è un'altra opzione per passare i parametri ai metodi di azione. Un caso d'uso comune per questo è il passaggio di credenziali o altri dati segreti in rete. Lo snippet di codice seguente illustra un metodo di azione che accetta un numero di carta di credito come parametro e restituisce true se il numero di carta di credito è valido.

[HttpGet]

[Route ("Default / IsCreditCardValid / {creditCardNumber}")]

public IActionResult IsCreditCardValid ([FromHeader] string creditCardNumber)

{

   stringa regexExpression =

   "^ (? :(? 4 [0-9] {12} (?: [0-9] {3})?) |" +

   "(? 5 [1-5] [0-9] {14}) |" +

   "(? 3 [47] [0-9] {13}) |) $";

   Regex regex = new Regex (regexExpression);

   var match = regex.Match (creditCardNumber);

   return Ok (match.Success);

}

Per semplicità, il metodo di azione IsCreditCardValid convalida solo le carte di credito Visa, MasterCard e Amex. Puoi estendere il metodo IsCreditCardValid per convalidare altri tipi di carte. Poiché il numero della carta di credito deve essere trasmesso in modo sicuro, utilizzare l'intestazione della richiesta è una buona scelta qui. La Figura 1 mostra come specificare il numero della carta di credito come parametro tramite l'intestazione della richiesta.

Passare i parametri tramite il corpo della richiesta in ASP.NET Core MVC

Spesso sarà necessario passare i parametri tramite il corpo della richiesta quando si eseguono operazioni di inserimento o aggiornamento. Il frammento di codice seguente illustra come passare un'istanza della classe Author tramite il corpo della richiesta.

[HttpPost]

[Route ("Default / Insert")]

public IActionResult Insert ([FromBody] Author author)

{

   return Ok (authorRepository.Save (author));

}

La Figura 2 mostra come specificare i dati da inserire nel corpo della richiesta.

Codice sorgente completo della nostra classe DefaultController

Il codice completo della classe DefaultController viene fornito di seguito come riferimento.

 public class DefaultController: Controller

    {

        privato in sola lettura AuthorRepository authorRepository =

        new AuthorRepository ();

        [HttpGet]

        [Route ("Default / GetAuthor / {authorId: int}")]

        public IActionResult GetAuthor (int authorId)

        {

            var data = authorRepository.GetAuthor (authorId);

            ritorno Ok (dati);

        }

        [HttpGet]

        [Route ("Default / GetAuthors / {pageNumber: int}")]

        public IActionResult GetAuthors ([FromQuery

        (Name = "pageNumber")] int pageNumber = 1)

        {

            var data = authorRepository.GetAuthors (pageNumber);

            ritorno Ok (dati);

        }

        [HttpGet]

        [Route ("Default / IsCreditCardValid / {creditCardNumber}")]

        public IActionResult IsCreditCardValid

        ([FromHeader] stringa creditCardNumber)

        {

            stringa regexExpression =

            "^ (? :(? 4 [0-9] {12} (?: [0-9] {3})?) |" +

            "(? 5 [1-5] [0-9] {14}) |" +

            "(? 3 [47] [0-9] {13}) |) $";

            Regex regex = new Regex (regexExpression);

            var match = regex.Match (creditCardNumber);

            return Ok (match.Success);

        }

        [HttpPost]

        [Route ("Default / Insert")]

        public IActionResult Insert ([FromBody] Author author)

        {

            return Ok (authorRepository.Save (author));

        }

    }

Infine, puoi anche passare parametri tramite un modulo. Un modulo viene spesso utilizzato quando si desidera caricare un file. In questo caso, dovresti sfruttare l'interfaccia IFormFile. 

Come fare di più in ASP.NET Core:

  • Come usare gli analizzatori di API in ASP.NET Core
  • Come usare i token di dati di route in ASP.NET Core
  • Come usare il controllo delle versioni delle API in ASP.NET Core
  • Come utilizzare gli oggetti di trasferimento dati in ASP.NET Core 3.1
  • Come gestire gli errori 404 in ASP.NET Core MVC
  • Come usare l'inserimento delle dipendenze nei filtri di azione in ASP.NET Core 3.1
  • Come usare il modello di opzioni in ASP.NET Core
  • Come usare il routing degli endpoint in ASP.NET Core 3.0 MVC
  • Come esportare dati in Excel in ASP.NET Core 3.0
  • Come usare LoggerMessage in ASP.NET Core 3.0
  • Come inviare messaggi di posta elettronica in ASP.NET Core
  • Come registrare i dati in SQL Server in ASP.NET Core
  • Come pianificare i processi utilizzando Quartz.NET in ASP.NET Core
  • Come restituire dati dall'API Web ASP.NET Core
  • Come formattare i dati di risposta in ASP.NET Core
  • Come utilizzare un'API Web ASP.NET Core usando RestSharp
  • Come eseguire operazioni asincrone utilizzando Dapper
  • Come usare i flag di funzionalità in ASP.NET Core
  • Come utilizzare l'attributo FromServices in ASP.NET Core
  • Come lavorare con i cookie in ASP.NET Core
  • Come lavorare con file statici in ASP.NET Core
  • Come usare il middleware di riscrittura degli URL in ASP.NET Core
  • Come implementare la limitazione della velocità in ASP.NET Core
  • Come usare Azure Application Insights in ASP.NET Core
  • Utilizzo di funzionalità NLog avanzate in ASP.NET Core
  • Come gestire gli errori nell'API Web ASP.NET
  • Come implementare la gestione delle eccezioni globale in ASP.NET Core MVC
  • Come gestire i valori null in ASP.NET Core MVC
  • Controllo delle versioni avanzato nell'API Web ASP.NET Core
  • Come lavorare con i servizi di lavoro in ASP.NET Core
  • Come utilizzare l'API di protezione dei dati in ASP.NET Core
  • Come usare il middleware condizionale in ASP.NET Core
  • Come lavorare con lo stato della sessione in ASP.NET Core
  • Come scrivere controller efficienti in ASP.NET Core