Webframeworkk/ASP.NET Core/Routing: Unterschied zwischen den Versionen
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( | |||
* <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( | * <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 | |||
|- | |- | ||
| <code>:int</code> || <code>{id:int}</code> || Muss eine Ganzzahl sein. | |||
|- | |- | ||
| <code>: | | <code>:alpha</code> || <code>{name:alpha}</code> || Nur Buchstaben. | ||
| <code>{ | |||
| | |||
|- | |- | ||
| <code>: | | <code>:regex()</code> || <code>{code:regex(^\\d{{3}}$)}</code> || Matcht regulären Ausdruck. | ||
| <code>{ | |||
| | |||
|- | |- | ||
| <code>: | | <code>:minlength()</code>|| <code>{slug:minlength(5)}</code> || Mindestlänge des Strings. | ||
| | |||
| <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 | </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")] | ||
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/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")] | ||
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]")] | ||
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}")] | ||
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:
- 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).