Webframeworkk/ASP.NET Core/Routing: Unterschied zwischen den Versionen

Aus Dokument
Zur Navigation springen Zur Suche springen
imported>Import
Version 180
// via Wikitext Extension for VSCode
 
Zeile 11: Zeile 11:


'''Vorteile:'''
'''Vorteile:'''
* '''Präzision:''' Routen können sehr spezifisch für einzelne Actions definiert werden.
* '''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.
* '''Lesbarkeit:''' Die Zuordnung von URL zu Code ist direkt am Controller/Action ersichtlich.
Zeile 17: Zeile 16:


'''Nachteile:'''
'''Nachteile:'''
* '''Fehlende Zentralisierung:''' Es gibt keinen einzigen Ort, an dem alle Routen der Anwendung eingesehen werden können.
* '''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.
* '''Redundanz:''' Ähnliche Routenmuster müssen oft an mehreren Stellen wiederholt werden.
Zeile 26: Zeile 24:
Hierbei definieren Sie ein oder mehrere globale Muster. Die Standardroute wird meist so konfiguriert:
Hierbei definieren Sie ein oder mehrere globale Muster. Die Standardroute wird meist so konfiguriert:


<syntaxhighlight lang="csharp">var builder = WebApplication.CreateBuilder(args);
<syntaxhighlight lang="csharp">
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
builder.Services.AddControllersWithViews();


Zeile 36: Zeile 35:
     .WithStaticAssets();
     .WithStaticAssets();


app.Run();</syntaxhighlight>
app.Run();
</syntaxhighlight>
 
'''Erklärung der Methoden:'''
'''Erklärung der Methoden:'''
* <code>app.MapControllers()</code>: Konfiguriert das Framework so, dass es Controller-Endpunkte erkennt und Routen basierend auf Attributen oder Konventionen zuordnet.
* <code>app.MapControllers()</code>: Konfiguriert das Framework so, dass es Controller-Endpunkte erkennt und Routen basierend auf Attributen oder Konventionen zuordnet.
* <code>.WithStaticAssets()</code>: Eine Optimierung für statische Dateien (CSS, JS), die Fingerprinting für effektives Caching nutzt (eingeführt in .NET 9).
* <code>.WithStaticAssets()</code>: Eine Optimierung für statische Dateien (CSS, JS), die Fingerprinting für effektives Caching nutzt (eingeführt in .NET 9).
Zeile 46: Zeile 46:
Attribute Routing ist flexibler und wird für REST-APIs oder komplexe URL-Strukturen bevorzugt. Bei Verwendung von MVC muss hierfür <code>app.MapControllers()</code> aufgerufen werden.
Attribute Routing ist flexibler und wird für REST-APIs oder komplexe URL-Strukturen bevorzugt. Bei Verwendung von MVC muss hierfür <code>app.MapControllers()</code> aufgerufen werden.


<syntaxhighlight lang="csharp">[Route("shop")]
<syntaxhighlight lang="csharp">
[Route("shop")]
public class ProductController : Controller
public class ProductController : Controller
{
{
Zeile 61: Zeile 62:
         return View(id);
         return View(id);
     }
     }
}</syntaxhighlight>
}
</syntaxhighlight>
 
=== Wichtige Attribute ===
=== Wichtige Attribute ===
 
* <code>[Route("path")]</code>: Definiert den Basispfad oder spezifischen Pfad.
* <code>[Route(&quot;path&quot;)]</code>: Definiert den Basispfad oder spezifischen Pfad.
* <code>[HttpGet]</code>, <code>[HttpPost]</code>, etc.: Schränkt die Route auf eine HTTP-Methode ein.
* <code>[HttpGet]</code>, <code>[HttpPost]</code>, etc.: Schränkt die Route auf eine HTTP-Methode ein.
* <code>[Area(&quot;Admin&quot;)]</code>: Ordnet den Controller einer Area zu.
* <code>[Area("Admin")]</code>: Ordnet den Controller einer Area zu.


== 4. Routen-Parameter und Model Binding ==
== 4. Routen-Parameter und Model Binding ==
Zeile 72: Zeile 74:
In MVC werden Routen-Parameter automatisch an die Argumente der Action-Methode gebunden (Model Binding).
In MVC werden Routen-Parameter automatisch an die Argumente der Action-Methode gebunden (Model Binding).


<syntaxhighlight lang="csharp">// Route: /archive/{year}/{month}
<syntaxhighlight lang="csharp">
// Route: /archive/{year}/{month}
[HttpGet("archive/{year:int}/{month:range(1,12)}")]
[HttpGet("archive/{year:int}/{month:range(1,12)}")]
public IActionResult GetArchive(int year, int month)
public IActionResult GetArchive(int year, int month)
{
{
     return Content($"Archiv für {month}/{year}");
     return Content($"Archiv für {month}/{year}");
}</syntaxhighlight>
}
</syntaxhighlight>
 
== 5. Routen-Constraints in MVC ==
== 5. Routen-Constraints in MVC ==


Zeile 83: Zeile 88:


{| class="wikitable"
{| class="wikitable"
! Constraint !! Beispiel !! Beschreibung
|-
|-
! Constraint
| <code>:int</code> || <code>{id:int}</code> || Muss eine Ganzzahl sein.
! Beispiel
! Beschreibung
|-
|-
| <code>:int</code>
| <code>:alpha</code> || <code>{name:alpha}</code> || Nur Buchstaben.
| <code>{id:int}</code>
| Muss eine Ganzzahl sein.
|-
|-
| <code>:alpha</code>
| <code>:regex()</code> || <code>{code:regex(^\\d{{3}}$)}</code> || Matcht regulären Ausdruck.
| <code>{name:alpha}</code>
| Nur Buchstaben.
|-
|-
| <code>:regex()</code>
| <code>:minlength()</code>|| <code>{slug:minlength(5)}</code> || Mindestlänge des Strings.
| <code>{code:regex(^\\d``$)}</code>
| Matcht regulären Ausdruck.
|-
| <code>:minlength()</code>
| <code>{slug:minlength(5)}</code>
| Mindestlänge des Strings.
|}
|}


Zeile 110: Zeile 104:


=== Token-Variablen ===
=== Token-Variablen ===
* <code>[controller]</code>: Wird durch den Controller-Namen ersetzt.
* <code>[controller]</code>: Wird durch den Controller-Namen ersetzt.
* <code>[action]</code>: Wird durch den Action-Namen ersetzt.
* <code>[action]</code>: Wird durch den Action-Namen ersetzt.
* <code>[area]</code>: Wird durch den Area-Namen ersetzt.
* <code>[area]</code>: Wird durch den Area-Namen ersetzt.


<syntaxhighlight lang="csharp">[Route("[controller]/[action]")]
<syntaxhighlight lang="csharp">
[Route("[controller]/[action]")]
public class UserController : Controller
public class UserController : Controller
{
{
Zeile 123: Zeile 117:
         return View();
         return View();
     }
     }
}</syntaxhighlight>
}
</syntaxhighlight>
 
== 7. Catch-All Parameter ==
== 7. Catch-All Parameter ==


Der Catch-All Parameter <code>*</code> erfasst alle verbleibenden URL-Segmente als einzelne Zeichenkette.
Der Catch-All Parameter <code>*</code> erfasst alle verbleibenden URL-Segmente als einzelne Zeichenkette.


<syntaxhighlight lang="csharp">[HttpGet("Neuformular/{*slug}")] // URL: /Neuformular/artikel/2024/dezember
<syntaxhighlight lang="csharp">
[HttpGet("Neuformular/{*slug}")] // URL: /Neuformular/artikel/2024/dezember
public IActionResult Index(string slug)
public IActionResult Index(string slug)
{
{
     // slug enthält: "artikel/2024/dezember"
     // slug enthält: "artikel/2024/dezember"
     return Content($"Slug: {slug}");
     return Content($"Slug: {slug}");
}</syntaxhighlight>
}
Der Parameter <code>{*slug}</code> erfasst alle verbleibenden Pfad-Segmente nach “Neuformular/als einzelne Zeichenkette und übergibt sie an die Action-Methode.
</syntaxhighlight>
 
Der Parameter <code>{*slug}</code> erfasst alle verbleibenden Pfad-Segmente nach "Neuformular/" als einzelne Zeichenkette und übergibt sie an die Action-Methode.
 


== 8. Arten von Attribute Routing ==
== 8. Arten von Attribute Routing ==
Zeile 141: Zeile 141:


* '''Einfache Routen''': Direktes Zuweisen eines Pfads an eine Action oder einen Controller.
* '''Einfache Routen''': Direktes Zuweisen eines Pfads an eine Action oder einen Controller.
 
    <syntaxhighlight lang="csharp">
<syntaxhighlight lang="csharp">   [Route("produkte/liste")]
    [Route("produkte/liste")]
     public IActionResult List() { ... }
     public IActionResult List() { ... }
     </syntaxhighlight>
     </syntaxhighlight>
* '''Mehrere Routen für eine Action''': Mehrere <code>[Route]</code>-Attribute an einer Methode.
* '''Mehrere Routen für eine Action''': Mehrere <code>[Route]</code>-Attribute an einer Methode.
 
    <syntaxhighlight lang="csharp">
<syntaxhighlight lang="csharp">   [Route("produkte")]
    [Route("produkte")]
     [Route("produkte/index")]
     [Route("produkte/index")]
     public IActionResult Index() { ... }
     public IActionResult Index() { ... }
     </syntaxhighlight>
     </syntaxhighlight>
* '''HTTP-Methode-spezifische Attribute''': Kombination von <code>[HttpGet]</code>, <code>[HttpPost]</code> usw. mit Routen.
* '''HTTP-Methode-spezifische Attribute''': Kombination von <code>[HttpGet]</code>, <code>[HttpPost]</code> usw. mit Routen.
 
    <syntaxhighlight lang="csharp">
<syntaxhighlight lang="csharp">   [HttpPost("produkte/erstellen")]
    [HttpPost("produkte/erstellen")]
     public IActionResult Create() { ... }
     public IActionResult Create() { ... }
     </syntaxhighlight>
     </syntaxhighlight>
* '''Token-basierte Routen''': Verwendung von Platzhaltern wie <code>[controller]</code> und <code>[action]</code>.
* '''Token-basierte Routen''': Verwendung von Platzhaltern wie <code>[controller]</code> und <code>[action]</code>.
 
    <syntaxhighlight lang="csharp">
<syntaxhighlight lang="csharp">   [Route("[controller]/[action]")]
    [Route("[controller]/[action]")]
     public IActionResult Edit() { ... }
     public IActionResult Edit() { ... }
     </syntaxhighlight>
     </syntaxhighlight>
* '''Routen mit Constraints''': Einschränkung von Parametern direkt im Attribut.
* '''Routen mit Constraints''': Einschränkung von Parametern direkt im Attribut.
 
    <syntaxhighlight lang="csharp">
<syntaxhighlight lang="csharp">   [HttpGet("produkte/{id:int}")]
    [HttpGet("produkte/{id:int}")]
     public IActionResult Details(int id) { ... }
     public IActionResult Details(int id) { ... }
     </syntaxhighlight>
     </syntaxhighlight>
Diese Flexibilität macht Attribute Routing besonders für komplexe oder REST-orientierte APIs attraktiv.
Diese Flexibilität macht Attribute Routing besonders für komplexe oder REST-orientierte APIs attraktiv.


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

Aktuelle Version vom 15. Februar 2026, 15:28 Uhr

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.


8. Arten von Attribute Routing

Im Attribute Routing gibt es verschiedene Möglichkeiten, Routen zu definieren:

  • Einfache Routen: Direktes Zuweisen eines Pfads an eine Action oder einen Controller.
    [Route("produkte/liste")]
    public IActionResult List() { ... }
  • Mehrere Routen für eine Action: Mehrere [Route]-Attribute an einer Methode.
    [Route("produkte")]
    [Route("produkte/index")]
    public IActionResult Index() { ... }
  • HTTP-Methode-spezifische Attribute: Kombination von [HttpGet], [HttpPost] usw. mit Routen.
    [HttpPost("produkte/erstellen")]
    public IActionResult Create() { ... }
  • Token-basierte Routen: Verwendung von Platzhaltern wie [controller] und [action].
    [Route("[controller]/[action]")]
    public IActionResult Edit() { ... }
  • Routen mit Constraints: Einschränkung von Parametern direkt im Attribut.
    [HttpGet("produkte/{id:int}")]
    public IActionResult Details(int id) { ... }

Diese Flexibilität macht Attribute Routing besonders für komplexe oder REST-orientierte APIs attraktiv.


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