2016-07-11 14 views
0

Meine Frage ist sehr ähnlich, andere Fragen. Wenn ich einen ActionLink in MVC .Net 4.5 verwende, erhalte ich eine Abfragezeichenfolge für einen Parameter statt nur für einen URL-Pfad. Ich habe versucht, die Lösung HERE, aber es hat nicht funktioniert.ActionLink zeigt Abfragezeichenfolge anstelle von URL-Parametern

CODE-

Innen RouteConfig.cs -

routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 

    routes.MapRoute(
      name: "MyControllerRoute", 
      url: "{controller}/{action}/{id}/{description}", 
      defaults: new { controller = "MyController", action = "MyAction", id = UrlParameter.Optional, description = UrlParameter.Optional } 
     ); 

Innen HomeController.cs -

public ActionResult Index(){ 
    --do stuff-- 
    return View(); 
} 

Innen MyController.cs -

public ActionResult Vote(int id, string description){ 
    --do stuff-- 
    return View(); 
} 

Innen Index.cshtml

@Html.ActionLink(
     "This is stuff", 
     "MyAction", 
     "MyController", 
     new { id = 123, description = "This-is-stuff" }, 
     null) 

Dieses Ergebnis LERNEN - (NICHT, WAS ICH WILL)

<a href="/MyController/MyAction/123?description=This-is-stuff">This is stuff</a> 

Gewünschtes Ergebnis - (WIE KANN ICH DIESES?)

<a href="/MyController/MyAction/123/This-is-stuff">This is stuff</a> 
+1

Move 'MyControllerRoute' vor der Standardroute. Und entfernen Sie 'id = UrlParameter.Optional, description = UrlParameter.Optional' von der' MyControllerRoute' Route (nur der letzte Parameter kann als optional markiert werden –

+0

Das hat funktioniert, danke Stephen! Wollen Sie eine "offizielle" Antwort machen, damit ich Kann ich Ihnen eine offizielle Antwort geben? –

+0

Der Grund, warum ich noch keine Antwort hinzugefügt habe, ist, dass es unklar ist, warum Sie beide Parameter in der 'MyControllerRoute' Route als optional markieren es gab immer einen Fall, in dem Sie nur entweder 'id' oder 'description' angeben würden (in diesem Fall würden Sie eine andere Lösung benötigen) –

Antwort

1

Sie müssen die Reihenfolge der Routen tauschen. Ich würde auch empfehlen, dass Sie den Controller-Namen (und optional den Aktionsnamen) in der URL-Definition verwenden, um mögliche Konflikte mit anderen Routen zu verhindern. Außerdem kann nur der letzte Parameter als UrlParameter.Optional markiert werden (andernfalls würde, wenn nur einer der Parameter bereitgestellt würde, die Route ignoriert und die URL würde zur Verwendung von Abfragezeichenfolgenwerten zurückkehren). Ihre Definitionen sollten (in Reihenfolge)

routes.MapRoute(
    name: "MyControllerRoute", 
    url: "MyController/MyAction/{id}/{description}", 
    defaults: new { controller = "MyController", action = "MyAction" } 
); 

routes.MapRoute(
    name: "Default", 
    url: "{controller}/{action}/{id}", 
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
); 
+0

Danke Soviel zu diesem Thema, Stephen, können Sie uns erklären, warum die Bestellung wichtig ist und warum sie die URL verpfuscht hat? –

+0

Wenn Sie 'ActionLink()' (oder andere Methoden, die tha Um URLs zu generieren, sucht die Methode nach dem Routenverzeichnis, das von Ihren Routendefinitionen generiert wurde, durchschreitet sie in der Reihenfolge, in der sie definiert wurden, und stoppt die Suche, sobald die Übereinstimmung gefunden wird. [Dieser Artikel] (https://msdn.microsoft.com/en-us/library/cc668201.aspx) - der Abschnitt mit dem Titel _Wie URLs auf Routen abgestimmt sind_ - erklärt das Verhalten. –

+0

Versucht, Attribut-Routing in diesem Artikel ohne Erfolg zu finden. Können Sie @StephenMuecke mitteilen, wo Attribute Routen die Reihenfolge berücksichtigen? –