2009-04-23 7 views
39

Mam następujący actionlink moim zdaniemasp.net mvc Html.ActionLink() prowadzenie wartość trasa nie chcę

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

i tworzy następujący adres URL http://mywebsite.com/Controller/Action

powiedzieć, dodaj Identyfikator na końcu tak: http://mywebsite.com/Controller/Action/53 i przejdź do strony. Na tej stronie mam wskazany powyżej znacznik. Teraz, gdy patrzę na URL tworzy wygląda to tak:

http://mywebsite.com/Controller/Action/53 (zauważ dodanie identyfikatora)

Ale chcę go usunąć identyfikator i wyglądają jak to miało miejsce pierwotnie, jak ten http://mywebsite.com/Controller/Action (zawiadomienie nr ID tutaj)

Jakieś pomysły, jak mogę to naprawić? Nie chcę używać zakodowanych adresów URL, ponieważ mój kontroler/działania mogą się zmieniać.

+1

Zobacz [niniejszy dokument] (https://aspnetwebstack.codeplex.com/workitem/1346), aby oficjalne wyjaśnienie firmy Microsoft dotyczyło tego problemu i sposobów jego obejścia. – NightOwl888

Odpowiedz

40

Rozwiązaniem jest określić własne wartości trasy (trzeci parametr poniżej)

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

Dziękuję za tę odpowiedź, potrzebowałem go do innych okoliczności, ale trafiłeś w gwoździe w prawo z tym końcem zerowym! –

+0

To wydaje się trochę kludgey ... Potrzebuję zrobić to samo, ale myślę, że być może będę musiał stworzyć nową metodę rozszerzenia, taką jak Arnis L, opublikowaną poniżej –

+1

Również wydaje się, że funkcjonalność powinna być wbudowana w strukturę, ponieważ sytuacja pojawia się często. Na przykład, mając menu, nie chcesz, aby link menu zawierał wszystkie parametry, tylko akcja –

9

Problem polega na tym, że wbudowane metody pobierają dane wejściowe z adresu URL, na którym aktualnie się znajdujesz, a także z tego, co podajesz. Możesz spróbować:

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

To powinno ręcznie usunąć parametr id.

4

Nie wiem dlaczego, ale to nie działa dla mnie (być może z powodu Mvc2 RC). Utworzono 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

Miałem ten sam problem (używając MVC2 RTM). Miałem wartość trasy o nazwie 'plan', a ostatnia (domyślna) trasa dodała ją jako'? Plan = X'. Dlatego dodałem wartość domyślną do ostatniej (domyślnej) trasy dla mojej wartości trasy 'plan' jako' plan = string.Empty'. Mimo że definicja trasy nie definiuje zmiennej segmentu adresu URL o nazwie "plan". Dopóki to zadziałało, nic mi nie jest. –

+0

Użyłem odmiany tego rozwiązania, aby niezawodnie i elegancko rozwiązać ten problem. –

12

Brzmi jak trzeba zarejestrować drugą „działanie tylko” trasy i korzystać Html.RouteLink(). Najpierw zarejestrować trasy takiego w tobie aplikacji uruchomić:

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

Wtedy zamiast actionlink tworzyć te powiązania użycia:

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

+1 za używanie 'Html.RouteLink()'. Pracowałem dla mnie - możesz także określić parametry routeValues, aby MVC stracił bieżącą akcję i powrócił do indeksu lub czegoś, np. '@ Html.RouteLink (" Anuluj "," ThisSection_default ", new {action =" Index "})'. – Jez

2

Innym sposobem jest użycie actionlink (HtmlHelper, String, String, RouteValueDictionary) przeciążenie, to nie ma potrzeby umieszczania zerowy w ostatnim parametrze

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

Jeśli albo nie wiem, co trzeba, aby być wyraźnie wartości nadpisane lub po prostu chcesz void dodatkową listę parametrów można użyć metody rozszerzenia, jak poniżej.

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

Dane wdrożeniowe są in this blog post

+0

Czysto i prosto, bardzo ładnie +1 –

+1

To brudny hack ... ale wciąż jest najlepszym rozwiązaniem, jakie znalazłem do tej pory. –

0

Potrzebowałem moje linki menu, aby być dynamiczne. Zamiast zaimplementować dużo dodatkowego kodu i routingu dla każdej strony, w prosty sposób zrezygnowałem z pomocnika HTML.

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

Jednoznacznie ustawiłem nazwę akcji jako "Działanie /". Wydaje się trochę jak hack, ale jest to szybkie rozwiązanie.

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

Musiałem to również zrobić, link miał indeksować, więc mogłem użyć tylko "/" jako akcji. @ Html.ActionLink ("Nazwa łącza", "/", "Kontroler") – Derrick

0

Przeciążenia pliku Html.ActionLink zostały zmienione w późniejszych wersjach MVC.W MVC 5 i powyżej. Oto jak to zrobić:

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

Uwaga minąłem "" dla parametru ID oraz NULL dla HTMLATTRIBUTES.