TOC

This article has been localized into German by the community.

Routing:

Routing Vorlagen

Bisher waren die von uns verwendeten Routen sehr einfach - ein statischer Pfad, manchmal kombiniert mit einem einfachen, variablen Parameter. Das Routing-System in ASP.NET MVC bietet jedoch noch viel mehr. Tatsächlich können Sie mithilfe von Routenvorlagen sehr fortgeschrittene URL-Routen erstellen. Wir werden einige der Möglichkeiten in diesem Artikel untersuchen.

In einem früheren Artikel haben wir die Syntax {id} verwendet, um einen Teil der URL einem Parameter mit dem Namen "id" in der empfangenden Controller-Methode zuzuordnen. Dies ist eine der grundlegendsten Routing-Vorlagen, die Sie verwenden können, Sie können jedoch nicht nur eine Variable / einen Parameter in Ihren Routen verwenden. Tatsächlich können Sie so viele verwenden, wie Sie möchten, und Sie können sie beliebig kombinieren. Dies könnte zum Beispiel verwendet werden, um eine URL mit einer ID und einem Slug zu erstellen, wie dies in vielen Blogsystemen wie Wordpress usw. der Fall ist.

Hier ist ein Beispiel für eine Routing-Vorlage, bei der zwei Parameter kombiniert werden, um die klassische [ID]/[URL_SLUG] -URL zu erstellen:

[Route("blog/{entryId}/{slug}")]
public IActionResult Blog(int entryId, string slug)
{
    return Content($"Blog entry with ID #{entryId} requested (URL Slug: {slug})");
}

Sie können diese Aktion jetzt über eine URL wie die folgende erreichen:

/blog/153/testing-asp-mvc-routes/

"153" wird dann dem Parameter entryId zugeordnet, während "testing-asp-mvc-routes" dem Parameter slug zugeordnet wird. Die Ausgabe wird durch unsere Aktionsmethode generiert:

Blog entry with ID #153 requested (URL Slug: testing-asp-mvc-routes)

Catch-All-Parameter

Wenn Sie die obige Route testen, werden Sie feststellen, dass Ihr Slug keine Schrägstriche (/) enthalten darf, wie diese:

/blog/153/testing-the/routing-system/  

Der Grund liegt wahrscheinlich auf der Hand: Der Schrägstrich wird normalerweise in URLs verwendet, um Ordnernamen zu trennen, und obwohl sich Ihre Route nicht unbedingt auf einen bestimmten Ordner bezieht, hat der Schrägstrich immer noch eine besondere Bedeutung. In diesem Fall scheint es, dass Sie versuchen, entweder zwei Ordner oder zwei Parameter mit den Werten "testing-the" und "routing-system" zu erreichen. Dies ist jedoch möglicherweise nicht das, was Sie möchten. Vielleicht ist es in Ihrem System sinnvoll, Schrägstriche als Teil des URL-Slugs zuzulassen. In solchen Situationen enthält ASP.NET MVC die sogenannten catch-all-Parameter.

Ein Catch-All-Parameter wird erstellt, indem dem Namen des Parameters ein Sternchen (*) vorangestellt wird:

[Route("blog/{entryId}/{*slug}")]
public IActionResult Blog(int entryId, string slug)
{
    return Content($"Blog entry with ID #{entryId} requested (URL Slug: {slug})");
}

Unsere frühere URL lässt jetzt den Schrägstrich im Parameter slug zu:

URL:  
/blog/153/testing-the/routing-system/    

Output:
Blog entry with ID #153 requested (URL Slug: testing-asp/mvc-routes)

Optionale Parameter

In den obigen Beispielen waren sowohl der entryId -Parameter als auch der slug -Parameter erforderlich. Wenn die URL nicht angegeben wird, stimmt die Routenvorlage einfach nicht mit der angeforderten URL überein, und als Ergebnis wird Entweder eine "404-Seite nicht gefunden" angezeigt oder sie wird über die Standard- / Fallback-Route abgefangen. Manchmal möchten Sie jedoch einen oder mehrere Parameter optional machen, was bedeutet, dass sie weggelassen werden können, ohne dass die Route nicht mit der URL-Anforderung übereinstimmt.

Sie können beispielsweise festlegen, dass der URL-Slug für Ihre Blog-Posts optional sein soll. Schließlich reicht die ID aus, um den gewünschten Blog-Post zu identifizieren und dem Benutzer anzuzeigen, während der Slug-Teil häufig aus SEO- / Lesbarkeitsgründen enthalten ist . Wenn Sie den Slug-Teil der URL optional machen möchten, müssen Sie lediglich ein Fragezeichen (?) Zum Parameternamen hinzufügen:

[Route("blog/{entryId}/{slug?}")]
public IActionResult Blog(int entryId, string slug)
{
    return Content($"Blog entry with ID #{entryId} requested (URL Slug: {slug})");
}

Sie können die Aktionsmethode jetzt mit einer URL wie dieser aufrufen:

/blog/153/

In diesem Fall ist der Parameter slug NULL. Dies ist kein Problem, wenn Sie es wie wir für die Ausgabe verwenden. Wenn Sie jedoch versuchen, den Wert für andere Zwecke zu verwenden, kann dies zu einer NullReferenceException führen. Um dies zu beheben, sollten Sie entweder vor der Verwendung auf NULL prüfen oder, falls dies in Ihrem Fall sinnvoller ist, dem Parameter einen Standard-Zeichenfolgenwert hinzufügen (leer oder nicht leer):

[Route("blog/{entryId}/{slug?}")]
public IActionResult Blog(int entryId, string slug = "")
{
    ....

Reservierte Routing Namen

Beachten Sie bei der Erstellung Ihrer Routen und der Angabe von beispielsweise Parameternamen die folgenden Begriffe, die innerhalb des Routingsystems reserviert sind und daher nicht als Namen / Parameternamen verwendet werden dürfen:

  • action
  • area
  • controller
  • handler
  • page

Zusammenfassung

Wie Sie sehen, ist das URL-Routing sehr flexibel, wenn Sie die in diesem Artikel veranschaulichte Vorlagenfunktionalität verwenden. Manchmal kann eine Route jedoch zu flexibel werden, was bedeutet, dass Konflikte mit anderen Routen auf Ihrer Website auftreten können. Unter anderem in diesen Situationen müssen Sie mehr Kontrolle über Ihre Routen haben - dies kann mit Routing-Einschränkungen erreicht werden, die wir im nächsten Artikel erläutern werden!


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!