Webframeworkk/ASP.NET Core/Routing

Aus Dokument
Zur Navigation springen Zur Suche springen

Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).



Dieses Tutorial behandelt das Routing speziell im Kontext von ASP.NET Core MVC. Es erklärt, wie eingehende Anfragen an Controller und deren Action-Methoden weitergeleitet werden.

1. Routing-Typen in MVC

In ASP.NET Core MVC gibt es zwei Hauptarten des Routings:

  1. Attribute Routing (Attribut-basiertes Routing): Definition von Routen direkt an Controllern oder Action-Methoden mithilfe von Attributen.

Vorteile:

  • Präzision: Routen können sehr spezifisch für einzelne Actions definiert werden.
  • Lesbarkeit: Die Zuordnung von URL zu Code ist direkt am Controller/Action ersichtlich.
  • Flexibilität: Einfache Handhabung von komplexen URL-Parametern und Constraints.

Nachteile:

  • Fehlende Zentralisierung: Es gibt keinen einzigen Ort, an dem alle Routen der Anwendung eingesehen werden können.
  • Redundanz: Ähnliche Routenmuster müssen oft an mehreren Stellen wiederholt werden.
  • Wartungsaufwand: Bei globalen URL-Änderungen müssen viele Attribute in verschiedenen Dateien angepasst werden.

2. Program Routing

Hierbei definieren Sie ein oder mehrere globale Muster. Die Standardroute wird meist so konfiguriert:

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();

var app = builder.Build();

app.UseStaticFiles();

app.MapControllers()
    .WithStaticAssets();

app.Run();

Erklärung der Methoden:

  • app.MapControllers(): Konfiguriert das Framework so, dass es Controller-Endpunkte erkennt und Routen basierend auf Attributen oder Konventionen zuordnet.
  • .WithStaticAssets(): Eine Optimierung für statische Dateien (CSS, JS), die Fingerprinting für effektives Caching nutzt (eingeführt in .NET 9).

3. Attribute Routing

Attribute Routing ist flexibler und wird für REST-APIs oder komplexe URL-Strukturen bevorzugt. Bei Verwendung von MVC muss hierfür app.MapControllers() aufgerufen werden.

[Route("shop")]
public class ProductController : Controller
{
    [Route("")] // URL: /shop
    [Route("index")] // URL: /shop/index
    public IActionResult List() 
    {
        return View();
    }

    [HttpGet("details/{id:int}")] // URL: /shop/details/5
    public IActionResult Details(int id)
    {
        return View(id);
    }
}

Wichtige Attribute

  • [Route("path")]: Definiert den Basispfad oder spezifischen Pfad.
  • [HttpGet], [HttpPost], etc.: Schränkt die Route auf eine HTTP-Methode ein.
  • [Area("Admin")]: Ordnet den Controller einer Area zu.

4. Routen-Parameter und Model Binding

In MVC werden Routen-Parameter automatisch an die Argumente der Action-Methode gebunden (Model Binding).

// Route: /archive/{year}/{month}
[HttpGet("archive/{year:int}/{month:range(1,12)}")]
public IActionResult GetArchive(int year, int month)
{
    return Content($"Archiv für {month}/{year}");
}

5. Routen-Constraints in MVC

Constraints stellen sicher, dass eine Route nur matcht, wenn die Parameter bestimmte Kriterien erfüllen.

Constraint Beispiel Beschreibung
:int {id:int} Muss eine Ganzzahl sein.
:alpha {name:alpha} Nur Buchstaben.
:regex() {code:regex(^\\dVorlage:3$)} Matcht regulären Ausdruck.
:minlength() {slug:minlength(5)} Mindestlänge des Strings.

6. Token Replacement (Platzhalter)

In Attributen können Platzhalter verwendet werden, um Redundanz zu vermeiden.

Token-Variablen

  • [controller]: Wird durch den Controller-Namen ersetzt.
  • [action]: Wird durch den Action-Namen ersetzt.
  • [area]: Wird durch den Area-Namen ersetzt.
[Route("[controller]/[action]")]
public class UserController : Controller
{
    [HttpGet] // URL: /user/profile
    public IActionResult Profile()
    {
        return View();
    }
}

7. Catch-All Parameter

Der Catch-All Parameter * erfasst alle verbleibenden URL-Segmente als einzelne Zeichenkette.

[HttpGet("Neuformular/{*slug}")] // URL: /Neuformular/artikel/2024/dezember
public IActionResult Index(string slug)
{
    // slug enthält: "artikel/2024/dezember"
    return Content($"Slug: {slug}");
}

Der Parameter {*slug} erfasst alle verbleibenden Pfad-Segmente nach "Neuformular/" als einzelne Zeichenkette und übergibt sie an die Action-Methode.


Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).