Nel precedente script ci siamo occupati di come definire le regole di routing tramite template all'interno dell'applicazione. Come avveniva anche nella precedente versione di ASP.NET MVC, anche in ASP.NET Core questo è solo uno dei possibili approcci.
L'alternativa più comune è quella di sfruttare l'attribute routing, ossia di decorare tramite specifici attributi le nostre action e controller per specificare a quali URL debbano essere associati.
Immaginiamo di avere il controller e la action seguenti:
public class AnotherController : Controller { [Route("ByAttribute/Index/{id:int}")] public IActionResult Index(int? id) { return View(id); } }
L'attributo Route specifica l'intero template di URL a cui questa action dovrà rispondere. Come possiamo notare, con una sintassi molto simile a quella utilizzata per la definizione dei route template, abbiamo anche indicato che nella route è presente un parametro e che esso dovrà essere di tipo int.
L'elenco completo dei constraint utilizzabili è contenuto in questa pagina della documentazione:
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/routing#route-constraint-reference
Se tutte le action che afferiscono a un controller hanno una parte dell'URL in comune, possiamo specificare questa porzione a livello di controller, e indicare sulla action eventuali altri path:
[Route("ByAttribute")] public class AnotherController : Controller { [Route("{id:int}")] [Route("Index/{id:int}")] public IActionResult Index(int? id) { return View(id); } }
In questo esempio abbiamo associato due path, /ByAttribute/{id} e /ByAttribute/Index/{id} alla action, definendo in pratica Index come action di default.
Una action può riscrivere la route definita a livello di controller anteponendo il carattere "/":
[Route("ByAttribute")] public class AnotherController : Controller { // risponde a http://localhost/TotallyDifferent [Route("/TotallyDifferent")] public IActionResult Index() { return View(id); } }
Se dobbiamo specificare anche l'HTTP Verb a cui la action deve rispondere, per esempio il POST, possiamo indicarlo assieme alla route utilizzando l'attributo HttpPost:
[Route("ByAttribute")] public class AnotherController : Controller { // risponde a http://localhost/TotallyDifferent [HttpPost("Index/{id:int}")] public IActionResult Index(int? id, MyModel model) { return View(id); } }
Un ultima nota riguarda la generazione dei link tramite tag-helper che, ovviamente, rispetterà le definizioni di routing che abbiamo impostato:
<!-- Genera un link a /ByAttribute/Index/{id} --> <a asp-action="Index" asp-controller="Another" asp-route-id="123">Test</a>
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Esporre i propri servizi applicativi con Semantic Kernel e ASP.NET Web API
Path addizionali per gli asset in ASP.NET Core MVC
.NET Conference Italia 2024
Configurare lo startup di applicazioni server e client con .NET Aspire
Usare una container image come runner di GitHub Actions
Popolare una classe a partire dal testo, con Semantic Kernel e ASP.NET Core Web API
Gestire la cancellazione di una richiesta in streaming da Blazor
Migliorare i tempi di risposta di GPT tramite lo streaming endpoint in ASP.NET Core
Creazione di plugin per Tailwind CSS: espandere le funzionalità del framework dinamicamente
Creare una libreria CSS universale - Rotazione degli elementi
Eseguire i worklow di GitHub su runner potenziati
Disabilitare automaticamente un workflow di GitHub