2010-01-18 6 views
5

Wir arbeiten mit einer asp.net mvc App, die von mehreren Clients gemeinsam genutzt wird. Wir benötigen die URLs, um den freundlichen URL der Clients zu enthalten. Zum Beispiel:MVC Custom Routes und ActionLinks

domain.com/clientName/controller/action/id

Dies scheint unten zu arbeiten, wenn es um Routing kommt, aber das „client“ ist nicht richtig für den Aktionslink Helfer erzeugt.

_routes.MapRoute("DefaultRoute", 
       "{clientName}/{controller}/{action}/{id}", 
       new { controller = "Home", action = "Index", id = string.Empty }, 
       new { clientName = @"[\w-]+" }); 

Wir möchten die Html.ActionLink Helper Methoden weiter zu verwenden, aber es enthält nicht den client in dem generierten Link. Müssen wir in diesem Szenario eigene Helfer schreiben oder gibt es einen alternativen Ansatz?

Hat jemand andere eine Anwendung mit dieser Art von Routing-Szenario erstellt? Irgendwelche Vorschläge würden geschätzt!

Antwort

0

Was Sie versuchen sollten zu tun arbeiten, ohne Routelink zu verwenden oder ein anonymes Objekt angibt. Stellen Sie sicher, dass Ihre Routenregistrierungen korrekt sind. Zum Beispiel, wenn Sie so etwas wie haben:

routes.MapRoute("Base", 
       string.Empty, 
       new { controller = "Home", 
       action = "Index", 
       id = string.Empty }); 

vor Ihrem default, kann es Anrufe Action verursacht seltsame Ergebnisse zurückzukehren. Ich bin schon vorher verbrannt worden.

7

Sie benötigen Route Werte angeben:

<%= Html.ActionLink("some text", "action", new { clientName = "someclient" })%> 

generieren:

http://host/someclient/Home/action 

Sie auch einen Standardwert angeben könnte, wenn die Route erklärt:

_routes.MapRoute("DefaultRoute", 
    "{clientName}/{controller}/{action}/{id}", 
    new { 
     controller = "Home", 
     action = "Index", 
     id = string.Empty, 
     clientName = "defaultClient" }, 
    new { clientName = @"[\w-]+" }); 
+0

Dies funktioniert ein Charme. Wie Sie in einem anderen Kommentar gesagt haben, müssen Sie den Catch als letzte Route setzen oder Sie erhalten unerwartete Ergebnisse. – Ian1971

11

Es war mein Erfahrung, dass die von Darin referenzierte ActionLink-Methode eine URL wie folgt generiert:

http://host/Home/action?clientName=someClient 

Wenn Sie die URL genau wie angegeben generieren möchten. Schauen Sie sich die RouteLink Methode, die Sie den Namen der Strecke angeben, können Sie passen:

<%= Html.RouteLink("some text", "DefaultRoute", new { clientName = "someclient" })%> 
+3

@Bryan, Ich habe den Code getestet, den ich bereitgestellt habe und er hat die erwartete URL generiert. Vielleicht haben Sie in Ihrem Fall die Routen-Deklaration in die falsche Reihenfolge gebracht und es war die Catch-All-Route, die ausgeführt wurde. Bestimmte Routen sollten vor der Sammelroute liegen. –

+0

guter Tipp - danke Darin. – Bryan

+0

Große Antwort, ich hatte das gleiche Problem beim Experimentieren mit MVCContrib Portable Area Routing. Es funktioniert nicht wie ein Zauber. –