2012-03-28 11 views
0

Ich habe diese beiden Routen in meiner App konfiguriert:ASP.NET MVC 3 Url.Action falsche Weg abgebildet

routes.MapRoute(
      "PromotionModel-test", // Route name 
      "testSpecifications", // URL with parameters 
      new { controller = "test", action = "Brochure", modelName = "test", groupID = 0 } // Parameter defaults 
     ); 

routes.MapRoute(
      "", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { groupID = 0, controller = "Home", action = "List", id = UrlParameter.Optional, CatID = 0 }, 
      new {controller = @"\w{3,}"} 
     ); 

Als ich

@Url.Action("Brochure", "test") 

rufen die URL es erzeugte „/ testSpecifications "statt" Test/Broschüre ". Wenn ich das explizit mache

Dann wird es das richtige Ergebnis erzeugen.

Ich weiß, gibt es Segment Variablenwiederverwendungsszenario, aber wie gilt es hier? Was ist die Logik hinter der Szene?

Updates

Was ich hier erreichen wollen ist einfach die URL zu erzeugen, ich alle Parameter, ohne dass Werte explizit oben hatte.

Stellen Sie sich vor, Sie haben mit der Entwicklung einer Website begonnen, für die keine Parameter benötigt wurden. Später haben Sie bemerkt, dass Sie möglicherweise mehrere Additionsparameter hinzufügen müssen. Im obigen Beispiel wurde der neue Parameter "modelName" hinzugefügt. Und dann bitten Sie den Client, die "testSpecifications" zuzuordnen, um auf die spezifische Seite wie die obige zu mappen.

Wir wollen definitiv nicht alle Url.Action aktualisieren, um die Standardwerte für jede von ihnen zu aktualisieren. Welchen Ansatz würden Sie verwenden, um damit umzugehen?

Hoffnung des Sinn ....

Antwort

0

Wie Kasper oben erwähnt, wird der Wert in "modelName" als "default" -Wert anstelle der Einschränkung verwendet, gegen die geprüft wird.

routes.MapRoute(
      "PromotionModel-test", // Route name 
      "testSpecifications", // URL with parameters 
      new { controller = "test", action = "Brochure", modelName = "test", groupID = 0 } // Parameter defaults 
     ); 

So ist der Schlüssel zur Lösung des Problems ist es eine constrain nicht nur Standardwert zu machen. Hier ist die richtige Routenkonfiguration, die mein Problem behebt.

Ich war selbst überrascht, wenn es Mapping korrekt sowohl für eingehende Anfrage gesehen (localhost/testSpecifications) und URL-Generierung (Url.Action ("Broschüre, Test") ...

routes.MapRoute(
       "PromotionModel-test", // Route name 
       "testSpecifications", // URL with parameters 
       new { controller = "test", action = "Brochure", modelName = "test", groupID = 0 }, 
       new { modelName="test"} 
      ); 
3

Die Logik ist wirklich einfach, wie in der Tat. Die Routen haben in der Reihenfolge der Deklaration Vorrang. Und da "Url.Action("Brochure" "test") mit der ersten Route übereinstimmt, ist es nur natürlich, dass MVC diese verwendet.

Im zweiten Fall setzen Sie explizit modelName, was bedeutet, dass es nicht mehr der ersten Route entspricht. Dies belässt die Standardroute.

aktualisieren Sie können die URL ‚/ testSpecifications‘ auf eine Aktion mit Standardwerten Karte genau wie Sie oben haben:

routes.MapRoute(
     "PromotionModel-test", // Route name 
     "testSpecifications", // URL with parameters 
     new { controller = "test", action = "Brochure", modelName = "test", groupID = 0}); 

Wenn Sie jedoch an einer beliebigen Stelle wollen mit einem diese URL erzeugen anderer Wert für modelName dann müssen Sie diese Parameter an die URL binden:

routes.MapRoute(
    "PromotionModel-test", // Route name 
    "testSpecifications/{modelName}", // URL with parameters 
     new { controller = "test", action = "Brochure", modelName = "test", groupID = 0}); 
    ); 

Mit der obigen Route können Sie entweder nur Link zu ‚/ testSpecifications‘ in diesem Fall der d Standardwerte für Modellname werden verwendet, oder Sie können den Wert für den Modellnamen explizit festlegen: '/ testSpecifications/SomeModelName'.

+0

erm .... Wie passt es zur ersten Route? Es erfordert den Modellnamen zu "Test". Ich habe den Modellnamen in der "Url.Action (" Brochure "" test ") überhaupt nicht übergeben." – Jack

+0

Nein, Sie legen den Standardwert fest –

+0

Also sagen Sie, wenn ich den Modellnamen nicht speziell festlege, wird er der ersten Route entsprechen, weil die Action- und Controller-Namen übereinstimmen und der Rest-Parameter als Standardwert behandelt wird, anstatt ihn zu verwenden als Voraussetzung für die Übereinstimmung? – Jack