2009-04-23 14 views
39

Ich habe folgende Action meiner Ansichtasp.net Mvc Html.ActionLink() zu halten Weg Wert Ich will nicht

<%= Html.ActionLink("LinkText", "Action", "Controller"); %> 

und es schafft die folgende URL http://mywebsite.com/Controller/Action

sagen, dass ich ein hinzufügen ID am Ende wie folgt: http://mywebsite.com/Controller/Action/53 und navigieren Sie zu der Seite. Auf dieser Seite habe ich das oben angegebene Markup. Nun, wenn ich unter der URL aussehen schafft es wie folgt aussieht:

http://mywebsite.com/Controller/Action/53 (man beachte die Zugabe der ID)

Aber ich will es die ID zu entfernen, und schaut, wie es ursprünglich war, wie diese http://mywebsite.com/Controller/Action (bemerke keine ID hier)

Irgendwelche Ideen, wie ich das beheben kann? Ich möchte keine hartcodierten URLs verwenden, da sich meine Controller/Aktionen ändern können.

+1

Siehe [dieses Workitem] (https://aspnetwebstack.codeplex.com/workitem/1346) für Microsoft offizielle Erklärung dieses Problems und Problemumgehungen. – NightOwl888

Antwort

40

Die Lösung ist meine eigene Route Werte (der dritte Parameter unten)

<%= Html.ActionLink("LinkText", "Action", "Controller", 
    new { id=string.Empty }, null) %> 
+0

Vielen Dank für diese Antwort, ich brauchte es für einen anderen Umstand, aber Sie treffen den Nagel direkt auf den Kopf mit der nachlaufenden Null! –

+0

Dies scheint ein wenig kluddy ... Ich muss das gleiche tun, aber ich denke, ich muss möglicherweise eine neue Erweiterungsmethode wie Arnis L geschrieben unter –

+1

Auch das scheint wie die Funktionalität in das Framework seit diesem eingebaut sein soll Situation kommt oft vor. Wenn Sie zum Beispiel ein Menü haben, möchten Sie nicht, dass die Menüverknüpfung alle Parameter enthält, sondern nur die Aktion –

9

Das Problem ist, die eingebauten Methoden nehmen die Eingabe von der URL, die Sie gerade sind, sowie was Sie liefern. Sie könnten dies versuchen:

<%= Html.ActionLink("LinkText", "Action", "Controller", new { id = ""}) %> 

Das sollte den ID-Parameter manuell löschen.

4

geben Sie wissen nicht, warum, aber es hat nicht für mich arbeiten (vielleicht wegen MVC2 RC). Erstellt UrlHelper method =>

public static string 
      WithoutRouteValues(this UrlHelper helper, ActionResult action,params string[] routeValues) 
     { 
      var rv = helper.RequestContext.RouteData.Values; 
      var ignoredValues = rv.Where(x=>routeValues.Any(z => z == x.Key)).ToList(); 
      foreach (var ignoredValue in ignoredValues) 
       rv.Remove(ignoredValue.Key); 
      var res = helper.Action(action); 
      foreach (var ignoredValue in ignoredValues) 
       rv.Add(ignoredValue.Key, ignoredValue.Value); 
      return res; 
     } 
+0

Ich hatte das gleiche Problem (mit MVC2 RTM). Ich hatte einen Routenwert namens "plan" und die letzte (Standard) Route fügte ihn als "? Plan = X" hinzu. Also habe ich der letzten (Standard) Route für meinen 'Plan'-Routenwert den Standardwert' plan = string.Empty' hinzugefügt. Auch wenn die Routendefinition die URL-Segmentvariable "Plan" nicht definiert. Solange es funktionierte, ging es mir gut. –

+0

Ich habe eine Variante verwendet, um dieses Problem zuverlässig und elegant zu lösen. –

12

Es klingt wie Sie eine zweite "Action-Only" Route zu registrieren brauchen und verwenden Html.RouteLink(). Zuerst registrieren, wie dies eine Route in Ihnen Anwendung starten:

routes.MapRoute("ActionOnly", "{controller}/{action}", 
    new { controller = "Home", action = "Index" }); 

Dann statt Action dieser Verbindungen erstellen verwenden:

Html.RouteLink("About","ActionOnly") 
+0

+1 für die Verwendung von 'Html.RouteLink()'. Arbeitete für mich - Sie können auch routeValues ​​angeben, damit MVC die aktuelle Aktion verliert und zum Index oder etwas zurückkehrt, z. '@ Html.RouteLink (" Abbrechen "," ThisSection_default ", neu {action =" Index "})'. – Jez

2

Ein anderer Weg ist Action (Htmlhelper, String, String zu verwenden, Routevaluedictionary) Überlast, dann gibt es keine Notwendigkeit, in den letzten Parameter

<%= Html.ActionLink("Details", "Details", "Product", new RouteValueDictionary(new { id=item.ID })) %> 
4

Wenn Sie entweder nicht wissen, welche Werte werden müssen ausdrücklich außer Kraft gesetzt oder Sie wollen einfach nur eine null setzen Löschen Sie die zusätzliche Liste der Parameter, die Sie mit einer Erweiterungsmethode wie der folgenden verwenden können.

<a href="@Url.Isolate(u => u.Action("View", "Person"))">View</a> 

Die Implementierungsdetails sind in this blog post

+0

Sauber und einfach, sehr schön +1 –

+1

Es ist ein dreckiger Hack ... aber es ist immer noch die beste Lösung, die ich bisher gefunden habe. –

0

ich meine Menü-Links benötigt dynamisch. Statt viel extra Code und Routing für jede einzelne Seite zu implementieren, habe ich einfach auf den HTML-Helfer verzichtet.

<a href="@(item.websiteBaseURL)/@(item.controller)/@(item.ViewName)">@item.MenuItemName</a> 
4

Ich habe den Aktionsnamen explizit als "Action /" festgelegt. Scheint ein wenig wie ein Hack, aber es ist eine schnelle Lösung.

@Html.ActionLink("Link Name", "Action/", "Controller") 
+0

Ich musste das auch tun, der Link war zu indizieren, also konnte ich nur "/" als Aktion verwenden. @ Html.ActionLink ("Link-Name", "/", "Controller") – Derrick

0

Die Überladungen von Html.ActionLink werden in den späteren Versionen von MVC geändert.Auf MVC 5 und höher. So wird das gemacht:

@Html.ActionLink("LinkText", "Action", "Controller", new { id = "" }, null) 

Hinweis Ich habe "" für ID-Parameter und null für HTMLATTRIBUTES übergeben.

Verwandte Themen