Użycie Html.ActionLink do wywołania akcji na innym kontrolerze


224

Próbuję nawigować między kontrolerami za pomocą ActionLink. Podam mój problem na przykładzie.

Korzystam z widoku Indeks kontrolera Hat i próbuję użyć poniższego kodu, aby utworzyć łącze do akcji Szczegóły kontrolera produktu.

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

Zamiast tworzyć łącze do szczegółów w kontrolerze produktu, generuje to łącze do działania szczegółów w obszarze kontrolera Hat i dołącza parametr długości na końcu:

Hat/Details/9?Length=7

Nie mogę używać HTML.ActionLinkprzełączania kontrolerów z powodu tego problemu. Będę wdzięczny, jeśli możesz wskazać mi, co robię źle. Dzięki

PS: Używam domyślnego ustawienia trasy dostarczonego z MVC

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

Odpowiedzi:


409

To, czego chcesz, to przeciążenie:

//linkText, actionName, controllerName, routeValues, htmlAttributes
<%=Html.ActionLink("Details", "Details", 
    "Product", new {id = item.ID}, null) %>

1
Czy możesz wyjaśnić, dlaczego to szczególne przeciążenie działa, a korki nie? Jak ustawienie wartości htmlAttributes na wartość NULL wpływa na routing łącza?
Derek Hunziker,

35
Dzieje się tak dlatego, że jeśli użyjesz innych parametrów, zakłada się, że trzeci argument to wartości tras, a czwarty argument to atrybuty html. Dodanie piątego argumentu zmusza metodę do użycia prawidłowego przeciążenia. Przerzucaj przeciążenia w inteligencji, a to będzie bardziej sensowne.
Banford

2
Przeciążenie ActionLink jest naprawdę niezdarne. Istotą przyjęcia „obiektu routeValues” zamiast RouteValueCollection jest zmniejszenie ilości pisania. Jednak ostatecznie musisz wpisać dodatkowy null.
Nieintuicyjny

3
Zgadzam się, parametry przeciążenia są źle zaprojektowane. Myślałem, że to błąd przez najdłuższy czas. Naprawdę musiałem wpatrywać się po raz 9. w inteligencję, żeby zrozumieć, że używam złego podpisu
Bkwdesign

1
Dla przyszłych czytelników, jeśli trafisz na ten problem i próbujesz dodać styl css, jest to prawidłowe przeciążenie. @ Html.ActionLink („MyText”, „MyAction”, „MyController”, null, nowy {@class = „myClass”})
granadaCoder

17

Za pomocą tych parametrów wyzwalasz niewłaściwą przeciążoną funkcję / metodę.

Co dla mnie zadziałało:

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

Uruchamia HtmlHelper.ActionLink (string linkText, string actionName, string controllerName, object routeValues, object htmlAttributes

Używam MVC 4.

Cheerio!


2
Twój wiersz kodu nie wyzwala przeciążenia, o którym wspomniałeś, ale HtmlHelper.ActionLink (string linkText, string actionName, object routeValues, object htmlAttributes). Daje to ten sam rezultat, którego OP próbował uniknąć. Musisz dodać dodatkowy parametr null.
TiMoch

Dzięki TiMoch, przegapiłeś to?
Stephan Venter

12

Polecam napisanie tych pomocników przy użyciu nazwanych parametrów dla zachowania przejrzystości w następujący sposób:

@Html.ActionLink(
    linkText: "Details",
    actionName: "Details",
    controllerName: "Product",
    routeValues: new {
        id = item.ID
    },
    htmlAttributes: null
)

Od 2019 r. Ta funkcja jest wdrażana w ReSharper przez JetBrains. W rzeczywistości jest to bardzo pomocne w takich okolicznościach.
Jamie,

10

Jeśli weźmiesz zestaw MVC Futures (który bardzo polecam), możesz następnie użyć ogólnego, tworząc ActionLink i lambda, aby skonstruować trasę:

<%=Html.ActionLink<Product>(c => c.Action( o.Value ), "Details" ) %>

Możesz pobrać zestaw futures tutaj: http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24471


Dzięki za właściwy link - próbowałem go znaleźć!
Perhentian

1
Ostrożnie z tym, ponieważ nie został uwzględniony w MVC2. Powodem jest to, że Akcje niekoniecznie są Metodami (z którymi się zgadzam, ale migracja będzie trudna, ponieważ od jakiegoś czasu stosujemy metodę ogólną). Oto pełny artykuł na temat tego, dlaczego nie jest przechowywany w 2: haacked.com/archive/2008/08/29/…
Stu

7

Trafisz źle, przeciążenie ActionLink. Spróbuj tego zamiast tego.

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

6

spróbuj, działa dobrze

  <%:Html.ActionLink("Details","Details","Product",  new {id=item.dateID },null)%>

3

Alternatywnym rozwiązaniem byłoby użycie Urlobiektu pomocnika do ustawienia hrefatrybutu <a>znacznika, takiego jak:

<a href="@Url.Action("Details", "Product",new { id=item.ID }) )">Details</a>

1

Pamiętaj, że Szczegóły to strona „Widok” w folderze „Produkty”.

ProductId jest kluczem podstawowym tabeli. Oto wiersz z Index.cshtml

 @Html.ActionLink("Details", "Details","Products" , new  {  id=item.ProductId  },null)

0

ten kod działał dla mnie w częściowym widoku:

<a href="/Content/Index?SubCategoryId=@item.Id">@item.Title</a>

Chociaż to działa, omija cały punkt korzystania z ActionLink ... Cały sens ActionLink polega na unikaniu ręcznego wpisywania adresu URL i potencjalnych problemów, które mogą się pojawić
Jon Story,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.