Restful Routing für ASP.NET MVC, basierend auf dem Ruby on Rails Routing DSL. Es utlizes HTTP-Verben eindeutige Pfade auf ein Minimum zu halten, während Ihre Controller-Struktur zu optimieren.

PM > Installationspaket RestfulRouting

Willkommen bei Restful Routing für ASP.NET MVC! Routing ist wohl der Kern aller ASP.Net MVC-Anwendungen. Das Verwalten von Routen selbst kann umständlich, frustrierend und unproduktiv sein. Einige Entwickler verwenden eine Catch-All-Route, die zu unerwarteten Problemen führen kann, wenn die Anwendung wächst. Restful Routing löst das Routing-Management-Problem, indem es eine eigenständige Schnittstelle zum Registrieren von Routen bereitstellt.

Wir hoffen, dass Sie feststellen, dass diese Bibliothek so einfach zu bedienen ist, dass Sie sich fragen werden, wie Sie sich jemals entwickelt haben ASP.Net MVC-Anwendungen ohne es.

Golden Seven

Restful Routing basiert auf der Idee von Resources und den Golden Seven-Aktionen:

Aktion HTTP-Methode
INDEX ERHALTEN
ZEIGEN ERHALTEN
BEITRAG ERSTELLEN
NEU ERHALTEN
BEARBEITEN ERHALTEN
AKTUALISIEREN SETZEN
ZERSTÖREN LÖSCHEN

Das Ziel von Restful Routing ist es, Sie auf Ihre Controller aufmerksam zu machen. Während Sie die Regeln gegebenenfalls verbiegen können, sollten Sie sich wirklich darauf konzentrieren, alle Controller auf diese sieben Aktionen zu beschränken. Wenn Sie gegen die Konventionen des Restful Routings kämpfen, werden Sie die Stärke unseres Opinionated Frameworks nicht nutzen und dabei unglücklich sein.

Standardroute

Bevor ich mich mit Restful Routing befasse, möchte ich die von ASP.NET MVC. Gefunden in vielen Starter-Vorlagen, ist es ein hilfreiches Werkzeug, wenn Sie beginnen, aber ich empfehle Ihnen nicht, es für jede Produktionsumgebung zu verwenden. Ich werde die Gründe unten auflisten:

  • Auf jeden Controller in Ihrem Projekt kann zugegriffen werden, auch wenn er nicht bei einem Routing-Framework wie Restful Routing registriert ist.
  • Dies kann zu unerwarteter Auflösung der ausgehenden Route und stundenlangem Debuggen führen.

Schritt 1. Installieren von Restful Routing

Um zu beginnen, gehen wir davon aus, dass Sie mit einem vorhandenen ASP.Net MVC-Projekt und verstehen, wie man zu diesem Punkt kommt.

Öffnen Sie die Paketmanager-Konsole und geben Sie Folgendes ein:PM> Install-Package RestfulRouting.

Wenn Sie die Paketmanager-Konsole nicht verwenden möchten, können Sie mit der rechten Maustaste auf Ihr Webprojekt klicken und den Kontextmenüpunkt „Nuget-Pakete verwalten“ auswählen. Suchen Sie nach RestfulRouting install the package.

Schritt 2. Restful Routing konfigurieren

An Ihrem Projekt sollten einige Änderungen vorgenommen worden sein, nämlich zwei Dateien hinzugefügt: Routes.cs und ApplicationController.

Routes.cs sollte wie der Abschnitt rechts aussehen. Wir haben bereits eine kleine Hilfe für Sie in dieser Datei enthalten. Nicht jeder schreibt eine Blog-Anwendung, also zögern Sie nicht, den kommentierten Code zu löschen, nachdem Sie ihn durchgesehen haben.

Beachten Sie die Abhängigkeit von WebActivator, dadurch wird sichergestellt, dass die Routen beim Start Ihrer Anwendung registriert werden. Sie können diese Abhängigkeit entfernen, wenn Sie die Start -Methode lieber selbst aufrufen möchten.

// setting the root routemap.Root<HomeController>(x => x.Index());

Stellen Sie für Ihre Konfiguration sicher, dass Root;

Zusätzlich zu Routes.cs erhalten Sie auch ApplicationController. Die Verwendung dieses Basis-Controllers ist optional, verfügt jedoch über den Code, der für die Verwendung von Formatergebnissen

Schritt 3 erforderlich ist. Motorkonfiguration anzeigen (optional)

ASP.Net MVC hängt von View Engines ab, um Ihre Ansichten zu finden. Während die Standardansicht-Engine in Ordnung ist, haben wir festgestellt, dass die Ordnerstruktur etwas ausführlich ist. Wenn Sie unsere View-Engines verwenden möchten, ändern Sie Ihre Global.asax-Datei wie folgt aussehen.

Da haben Sie es. Code! Code! Code!

Wenn Sie mehr darüber erfahren möchten, wie und was bei der Registrierung Ihrer Routen passiert, lesen Sie weiter.

Routensatz

In diesem Abschnitt erfahren Sie mehr über RouteSet. Die Klasse ist entscheidend, damit Restful Routing funktioniert.

Grundlagen

Ein Routenset ist eine Sammlung von Routenzuordnungen. Es definiert nicht nur Routen in Ihrer Anwendung, sondern kann auch eine Verbindung zu anderen Routensätzen herstellen und mit minimalem Aufwand eine Vielzahl von Routen erstellen.

Alle Routen werden innerhalb der Map -Methode eines Routesets definiert.

Die an Map übergebene IMapper-Instanz bietet eine Möglichkeit, Ihre Routen dem RouteTable -Wörterbuch zuzuordnen, das im Herzen jedes ASP.Net MVC-Anwendung. Wenn Sie Restful Routing über Nuget installiert haben, haben Sie festgestellt, dass bereits ein Routensatz für Sie erstellt wurde.

Manchmal möchten Sie Ihre Routensätze logisch trennen. Anstatt alle Routen in einem einzigen Routensatz zu gruppieren, bieten wir die Möglichkeit, Routensätze zu verbinden. Sie müssen ein RoutSet als Stamm Ihrer RouteSets auswählen, danach können Sie andere RouteSets beliebig verbinden. RouteSets unterstützen auch Namespaces, ähnlich wie Bereiche.

Konfiguration (optional)

Ein Routensatz enthält Einstellungen, die das Verhalten der Routenregistrierung ändern können. Diese Eigenschaften können im Kontext eines Routensatzes gefunden werden. Die meisten Entwickler werden diese Funktionen nicht berühren wollen.

Einstellung Standard Ergebnis
LowercaseUrls true URLs in unveränderlicher Kleinbuchstabenkultur registrieren
LowercaseDefaults true registrieren Sie Ihre Aktionen, wenn sie normalerweise in unveränderlicher Kleinbuchstabenkultur registriert sind
LowercaseActions true registrieren Sie Ihre Aktionen, wenn Sie mit Route in unveränderlicher Kleinbuchstabenkultur registriert sind
Kartenlöschen false registrieren Sie ein zusätzliche Aktion von Delete . Wird verwendet, um eine Löschbestätigungsseite anzuzeigen, bevor eine Ressource entfernt wird.

Mapping

Restful Routing ist ein Mapping-Framework, und für das Mapping stellen wir eine Reihe von Konzepten und Schnittstellen zur Verfügung. Lesen Sie unten mehr über die einzelnen Schnittstellen und welche Funktionen sie im Detail bieten.

Root

map.Root<HomeController>(x => x.Index());

Jede Anwendung benötigt eine Standardseite, und die Registrierung eines Root-Pfads war noch nie einfacher. Wenn Ihre Anwendung unter gehostet wurde, wird dies als root betrachtet.

Ihre Anwendung darf nur einen Stamm haben.

Ressource

map.Resource<ProfileController>();

Eine Ressource ist ein „Ding“, das aus der Perspektive des Anwendungsbenutzers einzeln betrachtet werden kann. Ein Profil für einen authentifizierten Benutzer ist ein gutes Beispiel für eine Ressource. Schauen Sie sich die folgende URL an. Wenn es um ein Profil geht, leiten Sie die Kennung über ein Cookie (oder andere implizite Mittel) ab und benötigen die Kennung nicht im Pfad der Route.

Die URL setzt voraus, dass die Anwendung weiß, was ein Profil ist und wie es dargestellt wird. Wie würde nun die Registrierung in einem Routensatz aussehen?

Aktionen und HTTP-Methoden

Beim Registrieren einer Ressource werden automatisch eine Reihe von Aktionen und Methoden registriert. Registrieren Sie Ihren Controller und implementieren Sie die Aktionen.

Aktion HTTP-Methode
ZEIGEN ERHALTEN
BEITRAG ERSTELLEN
NEU ERHALTEN
BEARBEITEN ERHALTEN
AKTUALISIEREN SETZEN
ZERSTÖREN LÖSCHEN

In unserem Beispiel mit ProfileController erhalten Sie die folgende Ausgabe:

Aktion HTTP-Methode Ergebnis (controller#action) URL
SHOW GET profil#show /profil
NEU GET Profil#neu /Profil/neu
CREATE POST profil#create /profil
EDIT GET profil#edit /profil/bearbeiten
AKTUALISIEREN PUT Profil #aktualisieren /profil
DESTROY DELETE profil#destroy /profil

Benennen

Manchmal nennen Sie Ihren Controller eine Sache, möchten aber, dass die Ressourcen-URL etwas ganz anderes widerspiegelt. Dies ist einfach zu tun.

Die neue URL wird für profile#show in die

Additionally, you can change the default action names of a resource by using the PathNames -Methode geändert. Dies wird nicht empfohlen, aber wir geben Ihnen gerne Optionen.

Auswählen von Aktionen

Manchmal benötigen Sie möglicherweise nicht alle Methoden, die wir für eine Ressource bereitstellen. Stellen Sie sich die folgenden Beispiele vor:

  • Als Benutzer sollte ich kein Profil erstellen können, da es implizit erstellt wird, wenn wir uns registriert haben.
  • Als Benutzer sollte ich in der Lage sein, mein aktuelles Profil zu bearbeiten.
  • Als Benutzer sollte ich mein Profil nicht löschen können.
  • Als Benutzer sollte ich mein Profil sehen können

Nach der Überprüfung müssen wir nur die folgenden Aktionen registrieren: Show, Edit, Update. Um unsere Ressource auf diese Aktionen zu beschränken, würden wir den folgenden Code in unserem RouteSet verwenden.

Verschachtelung einer Ressource

// NESTING A RESOURCEmap.Resource<ProfileController>(profile => { profile.Resource<CreditCardController>()});

Eine Ressource hängt manchmal von einer anderen Ressource ab. Beim Verschachteln einer Ressource besteht eine Eins-zu-Eins-Beziehung zwischen der übergeordneten Ressource und der abhängigen Ressource.

Wenn Sie eine creditcard -Ressource erstellen und diese in unserer profile -Ressource verschachteln (wie rechts angegeben), erhalten Sie die resultierenden Routen mit Ausnahme der Profilrouten:

Action HTTP Method Result (controller#action) Url Template
SHOW GET creditcard#show /profile/creditcard
NEW GET creditcard#new /profile/creditcard/new
CREATE POST creditcard#create /profile/creditcard
EDIT GET creditcard#edit /profile/creditcard/edit
UPDATE PUT Kreditkarte#update /Profil/Kreditkarte
DESTROY DELETE creditcard#destroy /profile/creditcard

Ressourcen

map.Resources<ProductsController>();

Ressourcen stellen Sammlungen innerhalb Ihrer Domäne dar. Stellen Sie sich vor, Sie erstellen eine Store-Anwendung, in der Sie Ihren Katalog verfügbar machen möchten, damit Kunden Produkte suchen und kaufen können. Produkte werden als Ressourcen betrachtet. Die generierte URL würde auch widerspiegeln, dass viele Produkte angeboten werden müssen.

Beachten Sie die Pluralisierung der Produkte. Wenn Sie eine E-Commerce-Website starten, würden Sie höchstwahrscheinlich mehr als ein Produkt gleichzeitig verkaufen.

Aktionen

Beim Registrieren von Ressourcen werden eine Reihe von Aktionen und Methoden automatisch registriert. Registrieren Sie Ihren Controller und implementieren Sie die Aktionen.

Aktion HTTP-Methode
INDEX ERHALTEN
ZEIGEN ERHALTEN
BEITRAG ERSTELLEN
NEU ERHALTEN
BEARBEITEN ERHALTEN
AKTUALISIEREN SETZEN
ZERSTÖREN LÖSCHEN

In unserem Beispiel mit ProductsController erhalten Sie die folgende Ausgabe:

Manchmal nennen Sie Ihren Controller eine Sache, möchten aber, dass die Ressourcen-URL etwas ganz anderes widerspiegelt. Dies ist einfach zu tun.

Die neue URL für Produkte #index wird geändert.

Darüber hinaus können Sie die Standardaktionsnamen einer Ressource mithilfe der Methode PathNames ändern. Dies wird nicht empfohlen, aber wir geben Ihnen gerne Optionen.

Anpassen des Parameters {id}

Standardmäßig wird der Name id für den Parameter Ressourcen-ID in Routen-URL-Mustern verwendet. Beispielsweise lautet das URL-Muster für die Aktion products#show in Aktionen und HTTP-Methoden oben /products/{id}.

In einigen Szenarien möchten Sie möglicherweise einen anderen Namen für den Parameter verwenden. Möglicherweise soll der Parametername mit dem Namen der Eigenschaft übereinstimmen, mit der die Ressource identifiziert wurde:

Die für die Aktion users#show hinzugefügte Route hätte dann das URL-Muster /users/{username} .

Auswählen von Aktionen

Manchmal benötigen Sie möglicherweise nicht alle von uns bereitgestellten Methoden. Sie können Aktionen mit den folgenden Methoden auf der rechten Seite entfernen.

Ressourcen verschachteln

map.Resources<ProductsController>(products => { products.Resources<ReviewsController>()});

Ressourcen hängen manchmal von anderen Ressourcen ab. Beim Verschachteln von Ressourcen besteht eine Eins-zu-Viele-Beziehung zwischen der übergeordneten Ressource und ihren abhängigen Ressourcen. Denken Sie an ein Produkt, das reviews.To dazu würden Sie die beiden Ressourcen wie folgt registrieren.

Mitglieds- und Sammlungsrouten

Verwenden Sie die Methoden Member und Collection innerhalb von Ressourcen, um Routen zur Sammlung (ohne ID-Routenparameter) oder zum Mitglied (mit ID-Routenparameter) hinzuzufügen. Für die Zuordnung verfügbare Methoden sind Get, Post, Put, Delete und Head. Im Kontext einer Ressource (Singular) haben Sie nur Zugriff auf die Methode Member.

Standard-Mapping

<!-- IN RAZOR VIEW --><a class="btn" href="@Url.Action("usingpath", "extras")">Path</a><a class="btn" href="@Url.Action("usingroute", "extras")">Route</a>

Manchmal funktionieren unsere Konventionen einfach nicht für Sie. Wir mögen eigensinnig sein, aber wir regieren nicht mit eiserner Faust.

Es werden zwei zusätzliche Methoden bereitgestellt, mit denen Sie benutzerdefinierte Routen hinzufügen können: Path ist eine Mischung aus traditionellen ASP.Net MVC Routing Syntax mit unserem Interface Wrapper. Route ist eine sehr traditionelle Art, eine benutzerdefinierte Route hinzuzufügen.

Bereiche

Bereiche werden vom Namespace im Restful Routing behandelt. Normalerweise gibt es eine Korrelation zwischen Ordnern und Namespaces, daher ist dies für die meisten Entwickler kein großer Unterschied zu dem, was sie bereits tun.

Der Controller, der der Area-Methode zur Verfügung gestellt wird, wird verwendet, um den Namespace für die gruppierten Controller zu bestimmen. Die Zeichenfolge „Zuordnungen“ wird verwendet, um den Namen des Bereichs zusammen mit dem URL-Teil zu bestimmen.

Denken Sie daran, dass Sie den Bereich beim Generieren von URLs angeben müssen. Um einen Bereich zu verlassen, können Sie den Bereich auf eine leere Zeichenfolge setzen. Alle Regeln mit einer Ressource und Ressourcen gelten weiterhin, wenn es um Bereiche geht.

View Engines

Restful Routing kommt mit zwei View Engines: RestfulRoutingRazorViewEngine und RestfulRoutingWebFormViewEngine. Schauen wir uns die eine dieser View Engines an.

Diese View Engines ändern die Art und Weise, wie ASP.Net MVC sucht nach Ansichten.

Formatergebnis

Mit dieser Funktion können Sie implizite Formaterweiterungen für eine Ressource und Ressourcen verwenden. Es gibt zwei Kernmethoden für diese Funktion: RespondTo, WithFormatRoutes.

<system.webServer> <modules runAllManagedModulesForAllRequests="true" /></system.webServer>
namespace RestfulRouting.Documentation.Controllers{ public abstract class ApplicationController : Controller { protected ActionResult RespondTo(Action<FormatCollection> format) { return new FormatResult(format); } }}
// IN ROUTESET// enable format routesextras.WithFormatRoutes();

Wir bieten eine Reihe bekannter Typen an, um die Verwendung unserer Fluent-Oberfläche ein wenig angenehmer zu gestalten, aber wir unterstützen jede erdenkliche Dateierweiterung. Um diese Formatrouten zu generieren, geben Sie einfach das Format wie folgt an.

Genial oder?! Wir empfehlen Ihnen, den folgenden Abschnitt von Quirks / Gotchas zu lesen, wenn Sie Formatierungsrouten verwenden möchten.dies ist hilfreich, wenn Sie Single-Page-Anwendungen sparsam verwenden und verstehen, wann es angebracht ist, die Funktionalität in Ihren Aktionen zu trennen.

Tote Links umleiten

Es gibt Zeiten, in denen wir bessere URL-Entscheidungen treffen als andere. Wir wollen die Möglichkeit, die URLs zu ändern, ohne bestehende URLs zu brechen. Dies ist nur erforderlich, wenn Ihre Anwendung live geschaltet wird. Dies gilt hauptsächlich für öffentlich zugängliche Websites, kann jedoch in einer Intranet-Situation nützlich sein.

Als erstes sollten Sie alle Ihre Umleitungsrouten als letzte Routen in Ihrer Liste registrieren. Dies liegt daran, dass sie am wenigsten wichtig sind. Das wird immer nur getroffen, wenn auf einen alten Link zugegriffen wird. Ihre Anwendung sollte diese URLs nicht generieren, und wenn ja, haben Sie Probleme.

Zweitens sieht die Registrierung wie die gute alte Syntax von RestfulRouting aus, erfordert jedoch nicht, dass Sie sie in einer Definition verschachteln. Ich würde empfehlen, ein RouteSet namens DeadLinks oder Redirects zu erstellen und es am Ende Ihres Master-Routesets zu verbinden.

Schließlich, und das ist wichtig, registrieren Sie das Redirectroutefilterattribute als globalen Filter.

Wie Sie rechts sehen können, legen Sie einfach die alte URL fest und geben Werte an, die in die neue URL aufgelöst werden sollen. Wir verwenden den UrlHelper unter der Decke, um die am besten passende Route zu finden.

Route Debugger

// IN ROUTESETmap.DebugRoute("routedebug");

Restful Routing wird mit einem leistungsstarken Routen-Debugger geliefert, der Ihnen helfen soll, Ihre Routenzuordnungen zu verstehen. Sie können den Routen-Debugger aktivieren und deaktivieren, indem Sie Ihrem Routensatz die folgende Zeile hinzufügen.

Macken / Fallstricke

Dieser Abschnitt versucht, einige Macken mit ASP.NET MVC und Restful Routing. Dies kann manchmal zu Problemen führen, und es ist gut zu verstehen, warum und wann sie sich auf Ihre Anwendung auswirken können.

Persistente Routenwerte

ASP.Net MVC versucht immer hilfreich zu sein. Hilfreich, obwohl gut gemeint, kann manchmal zu seltsamem Verhalten führen. Das größte Problem können gespeicherte Routenwerte aus Ihrer vorhandenen Anfrage sein.

Wenn Sie diese Eigenart verstehen, können Sie viele Probleme debuggen, nicht nur mit Restful Routing, sondern auch mit ASP.NET MVC im Allgemeinen. Sie können das Beispiel rechts sehen.

Mischen von Zuordnungsebenen

map.Resource<ProfileController>(profile => { // DOH! should be profile // not map! // EXCEPTION!!!! map.Resource<CreditCardController>()});

Restful Routing ist so konzipiert, dass es fließend und verschachtelt ist. Während der Erstellung Ihres RouteSet rufen Sie möglicherweise versehentlich den falschen Parameter auf, was zu einem Fehler führt, der möglicherweise schwer zu diagnostizieren ist. Unsere Ausnahme ist hilfreich, aber dies ist ein häufiger Fehler, den wir beschlossen haben, ihn zu dokumentieren.

Namespaces und Namenskonflikte

Manchmal möchten wir Controller gleich benennen, haben sie aber in verschiedenen Namespaces. Dies ist angemessen, wenn Sie einen administrativen und nach vorne gerichteten Abschnitt Ihrer Site erstellen. Denken Sie daran, die Namespaces entsprechend festzulegen, damit Sie den richtigen Controller instanziieren können.