2012-05-23 4 views
8

Ich versuche, einige benutzerdefinierte Kartenrouten zu erstellen, aber es funktioniert nicht richtig.Benutzerdefinierte MapRoute

Mein ultimatives Ziel ist es, etwas wie das Folgende zu spezifizieren. Wobei ich meine URL im Wesentlichen mit den Wertpaaren "ID" und "Name" aufgebaut habe. Der Name ist irrelevant und nur für Benutzer Höflichkeiten, ich werde jedoch die ID in meinem Controller erfordern.

/Dashboards/5-My-Immobilien-name/89-My-Untergruppe-Name/133-Maybe-even-another-Untergruppe

Für den Anfang auf dem ersten Abschnitt arbeite ich und Probleme haben.

Browsing "http: // localhost: 53933/Dashboards/109-Gebäude-xyz", während die folgende Route mit dem Fehler A public action method '109-building-xyz' was not found on controller 'MyInterfaceInterface.Controllers.DashboardsController'.

routes.MapRoute(
    "Dashboard", 
    "dashboards/{id}-{name}", // URL pattern 
    new { controller = "Dashboards", action = "Index" }, 
    new { id = @"\d+", name = UrlParameter.Optional } 
); 

Offensichtlich ich dies auf die Index-Funktion geleitet werden wollte erzeugt mit Parametern.

Was mache ich falsch? Strukturiere ich das überhaupt richtig? Ich komme aus einem Web-PHP-Hintergrund und benutze htaccess, um solche Dinge zu erreichen.

Dank

+1

Haben Sie dies nach der Standardroute oder davor hinzugefügt? – Chris

+0

Ich denke, dass Sie Parameter nur mit einem Schrägstrich trennen können (aber das könnte falsch sein). Wenn der Bindestrich als Trennzeichen akzeptiert wird, ist es wahrscheinlich, dass Sie den Bindestrich nach der ID einfügen müssen, damit die Route funktioniert. Wie Chris anmerkt, ist auch die Reihenfolge der Routen wichtig. Ich würde empfehlen, NuGet zu verwenden, um das RouteDebugger-Paket zu installieren (und es in Web.config zu aktivieren). Sie können leicht herausfinden, mit welcher Route eine bestimmte URL übereinstimmt. –

Antwort

9

Die Reihenfolge der Routen wichtig. MVC gleicht die erste deklarierte Route mit einem Muster ab, das dem URL-Muster entspricht.

Also, wenn Sie diese haben:

routes.MapRoute(
    "Default", 
    "{controller}/{action}/{id}", // URL pattern 
    new { controller = "Home", action = "Index" }, 
    new { id = UrlParameter.Optional } 
); 
routes.MapRoute(
    "Dashboard", 
    "dashboards/{id}-{name}", // URL pattern 
    new { controller = "Dashboards", action = "Index" }, 
    new { id = @"\d+", name = UrlParameter.Optional } 
); 

Was ist dann mit der URL geschehen wird http://localhost:53933/dashboards/109-building-xyz ist, dass MVC „Dashboards“ an den Controller und „109-Gebäude-xyz“ auf die Aktion übereinstimmen.

Sie müssen immer Ihre spezifischsten Routen erklären zuerst, und allgemeinere Routen später, etwa so:

routes.MapRoute(
    "Dashboard", 
    "dashboards/{id}-{name}", // URL pattern 
    new { controller = "Dashboards", action = "Index" }, 
    new { id = @"\d+", name = UrlParameter.Optional } 
); 
routes.MapRoute(
    "Default", 
    "{controller}/{action}/{id}", // URL pattern 
    new { controller = "Home", action = "Index" }, 
    new { id = UrlParameter.Optional } 
); 

jedoch Morten Mertner ist direkt in seinem Kommentar - ich glaube nicht, Sie haben 2 Routenparameter, die nicht durch einen Schrägstrich getrennt sind. Sie müssten Ihr URL-Muster so ändern, dass es mit der Standard-Routing-Engine verwendet werden kann:

"dashboards/{id}/{name}" 
Verwandte Themen