Frage

Ich habe folgende Action meiner Ansicht

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

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

Sagen, dass ich am Ende eine ID hinzufügen wie folgt: http://mywebsite.com/Controller/Action / 53 und auf der Seite navigieren. Auf dieser Seite habe ich die Auszeichnungs ich oben angegeben. Nun, wenn ich unter der URL aussehen schafft es sieht wie folgt aus:

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

Aber ich will es die ID zu entfernen, und schauen, wie es ursprünglich tat, wie dieser http://mywebsite.com / Controller / Aktion (man beachte hier keine ID)

Alle Ideen, wie kann ich dieses Problem beheben? Ich will nicht hart codierte URLs verwenden, da mein Controller / Aktionen ändern können.

War es hilfreich?

Lösung

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

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

Andere Tipps

Es klingt wie Sie eine zweite „Action-Only“ Route zu registrieren brauchen und verwenden Html.RouteLink (). Zuerst registriert eine Route wie diese in Ihrer Anwendung starten:

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

Dann anstelle von Action erstellen diese Verbindungen verwenden:

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

Das Problem ist, die in Methoden gebaut nehmen Eingabe von der URL, die Sie sich gerade befinden, als auch, was Sie liefern. Sie könnten versuchen, diese:

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

Das sollte die ID-Parameter manuell löschen.

Sie wissen nicht, warum, aber es hat nicht funktioniert für mich (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;
        }

Wenn Sie entweder nicht wissen, welche Werte müssen ausdrücklich außer Kraft gesetzt werden, oder Sie wollen einfach nur die zusätzliche Liste von Parametern vermeiden Sie eine Erweiterungsmethode wie unten verwenden können.

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

Die Implementierungsdetails sind in diesem Blog-Eintrag

ich explizit den Namen der Aktion als "Action /" gesetzt. Scheint ein wenig wie ein Hack, aber es ist eine schnelle Lösung.

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

Eine andere Möglichkeit ist Action (Htmlhelper, String, String, Routevaluedictionary) Überlast zu verwenden, dann gibt es keine Notwendigkeit, in den letzten Parameter null zu setzen

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

Die Überlastung von Html.ActionLink ist auf den späteren Versionen von MVC geändert. Auf MVC 5 und höher. Dies ist, wie dies zu tun:

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

Hinweis I "" für Parameter id und null für Htmlattributes geben.

Ich brauchte meine Menü-Links dynamisch. Anstatt eine Menge zusätzlichen Code zu implementieren und Routing für jeden einzelne einfache Seite, die ich mit dem HTML-Helfer ausgegeben.

<a href="@(item.websiteBaseURL)/@(item.controller)/@(item.ViewName)">@item.MenuItemName</a>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top