TOC

This article has been localized into German by the community.

Routing:

Routing Einschränkung

In den vorherigen Artikeln dieses Kapitels haben wir gesehen, wie wir sehr flexible und damit weitgehend passende Routenvorlagen erstellen können, um viele verschiedene Arten von URL-Strukturen zu erfassen und diese korrekt zuzuordnen. Irgendwann stimmen Ihre Routen jedoch möglicherweise zu weit überein, oder Sie haben nur eine bestimmte Struktur, die Sie erzwingen möchten. Zu diesem Zweck hat ASP.NET MVC das clevere Konzept der Routenbeschränkungen eingeführt, mit dem Sie die Parameter Ihrer Routen präziser definieren können.

Schauen wir uns das Beispiel aus dem vorherigen Artikel an, in dem wir eine Route für die Behandlung eines klassischen ID / UrlSlug-Szenarios erstellt haben, um zu veranschaulichen, wie Routing-Einschränkungen helfen können:

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

Es gibt verschiedene Arten von Routenbeschränkungen. Sehen wir uns anhand dieses Beispiels an, wie sie alle funktionieren.

Datentyp Beschränkung

In diesem Fall verwenden wir eine Ganzzahl für den entryId-Parameter, sodass wir dies auch direkt in der Vorlage erzwingen können, indem wir die spezielle Route-Constraint-Syntax verwenden:

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

Der Unterschied liegt darin, dass ich ich :int wie folgt hinzugefügt habe: {entryId: int}. Jetzt stimmt die URL nur mit der Route überein, wenn der Parameter entryId eine Ganzzahl ist. Das sieht so aus:

/blog/153/testing-the-system/

URL's wie diese stimmen nicht mehr überein:

/blog/abc153def/testing-the-system/

Einschränkungstypen für Datentypen

Die int -Datentypbeschränkung ist natürlich nur eine von vielen. Hier sind Beispiele für andere Datentypeinschränkungen, die Sie in Ihren Routen verwenden können:

  • {entryId:int}
  • {isVisible:bool}
  • {entryDate:datetime}
  • {weight:double}
  • {weight:float}
  • {price:decimal}
  • {id:guid}
  • {postId:long}

Längen- / Bereichsbeschränkungen

Eine andere Art von Routenbeschränkungen hilft Ihnen, eine bestimmte minimale und / oder maximale Länge für Zeichenfolgen oder einen minimalen / maximalen Wert für numerische Typen zu erzwingen. Wir könnten das nutzen, um unsere Routenvorlage noch genauer zu machen. Da zum Beispiel die entryId wahrscheinlich mit einem Datenbankeintrag übereinstimmen sollte, können wir argumentieren, dass der Wert höher als 0 sein sollte. Dazu können wir die min -Einschränkung verwenden:

[Route("blog/{entryId:min(1)}/{slug}")]  
public IActionResult Blog(int entryId, string slug)  
{  
    ....

Wenn wir wissen, dass es einen Maximalwert gibt, können wir die max -Einschränkung verwenden, die genau wie die min -Einschränkung funktioniert. oder, wenn es sowohl einen minimalen als auch einen maximalen Wert gibt, können wir die range -Beschränkung verwenden:

[Route("blog/{entryId:range(1, 999999)}/{slug}")]
public IActionResult Blog(int entryId, string slug)
{
    ....

Wir möchten auch verhindern, dass für den Parameter slug leere Zeichenfolgen verwendet werden. Da der Slug wahrscheinlich auf dem Titel des Blogposts in unserem Szenario basiert, können wir argumentieren, dass der Slug niemals kürzer als 3 Zeichen sein sollte. Hierfür können wir die minlength -Einschränkung verwenden:

[Route("blog/{entryId:range(1, 999999)}/{slug:minlength(3)}")]
public IActionResult Blog(int entryId, string slug)
{
    ....

Falls Sie es brauchen, gibt es natürlich auch eine maxlength -Beschränkung und sogar eine length -Beschränkung - die erste gibt eine maximale Länge an, während die letztere eine bestimmte Zeichenfolge erzwingt z.B.: length(8), um nur eine Zeichenfolge mit genau 8 Zeichen zu akzeptieren.

Kombinieren mehrerer Beschränkungen

In Anbetracht der obigen Ausführungen ist dies meiner Meinung nach ein guter Zeitpunkt, um ein wichtiges Detail der Routenbeschränkungen zu veranschaulichen: Sie können einfach kombiniert werden. Beispielsweise benötigen Sie möglicherweise sowohl einen bestimmten Datentyp als auch eine Mindestlänge, oder Sie können sogar mehrere Längeneinschränkungen miteinander verknüpfen. Sie trennen einfach jede Einschränkung mit einem : (Doppelpunkt) wie folgt:

[Route("blog/{entryId:int:range(1, 999999)}/{slug:minlength(3):maxlength(50)}")]
public IActionResult Blog(int entryId, string slug)
{
    ....

In diesem Fall muss der erste Parameter vom Datentyp Integer sein und zwischen 1 und 999999 liegen. Der zweite Parameter ist standardmäßig eine Zeichenfolge, da kein Datentyp angegeben ist und er muss mindestens 3 Zeichen lang sein und nicht länger als 50 Zeichen.

Einschränkungen für reguläre Ausdrücke

Wenn Sie noch mehr Kontrolle darüber benötigen, wie akzeptierte Parameter aussehen können, können Sie reguläre Ausdrücke verwenden. Mit ihnen können Sie ein sehr genaues Muster festlegen, indem Sie alle äußerst leistungsstarken Textvergleichstools verwenden, die in der Syntax für reguläre Ausdrücke enthalten sind. Tatsächlich sind reguläre Ausdrücke ein großes Thema, daher wird die Syntax in diesem Artikel nicht behandelt, aber ich werde Ihnen natürlich zeigen, wie Sie einen regulären Ausdruck in einer ASP.NET MVC-Routenbeschränkung verwenden können.

Inspiriert von unserem URL-Slug-Beispiel, das in den obigen Beispielen häufig verwendet wird, könnten wir entscheiden, dass unsere Eintrags-ID und der Slug-Teil keine separaten Parameter sind. Stattdessen möchten wir, dass sie in einer natürlicheren Zeichenfolge kombiniert werden, sodass URLs wie diese möglich sind :

/blog/153-testing-the-system/

Wir möchten weiterhin, dass der erste Teil eine Ganzzahl ist, die es uns ermöglicht, den gewünschten Beitrag in der Datenbank anhand der ID zu finden. Daher erstellen wir einen regulären Ausdruck, der mit diesem URL-Typ übereinstimmt:

^[0-9]{1,7}\-[a-z0-9\-]{3,50}$

Wenn Sie keine regulären Ausdrücke kennen, sieht das wahrscheinlich nach Kauderwelsch aus, aber bleiben Sie trotzdem bei mir. Gemäß diesem Regex benötigen wir eine Zeichenfolge, die mit einer Zahl beginnt, mit einer minimalen Länge von 1 und einer maximalen Länge von 7 (Länge der übereinstimmenden Zeichenfolge, z. B. 9999999). Danach sollte ein Bindestrich und dann eine Zeichenfolge aus Buchstaben, Zahlen und Bindestrichen mit einer Mindestlänge von 3 und einer Höchstlänge von 50 auftreten. Dies können wir nun mit dem regex() auf unserer Route anwenden und somit Einschränken:

[Route(@"blog/{slug:regex(^[[0-9]]{{1,7}}\-[[a-z0-9\-]]{{3,50}}$)}")]    
public IActionResult Blog(string slug)    
{    
    ....

Sie werden feststellen, dass der Regex-Teil etwas anders aussieht als zuvor. Da die Routenbeschränkungssyntax Sonderzeichen wie { und [ verwendet, die auch in einem regulären Ausdruck eine besondere Bedeutung haben, werden sie durch Verdoppeln maskiert.

Jetzt können Sie in Ihrer Aktionsmethode einfache Techniken zum Aufteilen von Zeichenfolgen verwenden, um den ID-Teil vom Slug-Teil zu trennen und dann den richtigen Beitrag abzurufen und anzuzeigen. Hier ist ein Beispiel:

[Route(@"blog/{slug:regex(^[[0-9]]{{1,7}}\-[[a-z0-9\-]]{{3,50}}$)}")]  
public IActionResult Blog(string slug)  
{  
    int hyphenPos = slug.IndexOf("-");  
    int entryId = int.Parse(slug.Substring(0, hyphenPos));  
    string slugPart = slug.Substring(hyphenPos + 1);  
    return Content($"Blog entry with ID #{entryId} requested (URL Slug: {slug})");  
}

Mithilfe der regulären Ausdrücke können Sie also selbst die komplexesten URL-Muster für Ihre Routen erzwingen.

Zusammenfassung

Durch das Anwenden von Einschränkungen auf Ihre Routen erhalten Sie mehr Kontrolle darüber, wann eine URL mit einer bestimmten Route übereinstimmt. Dies ist besonders nützlich, wenn Sie mehrere ähnliche Routen haben, die sich gegenseitig stören könnten. Durch Anwenden von Routenbeschränkungen auf eine oder mehrere dieser Routen erhalten Sie mehr Kontrolle darüber, welche Route für verschiedene URLs geeignet ist.


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!