Dołączanie tagu kotwicy do ASP.NET MVC Html.ActionLink

151

W ASP.NET MVC próbuję utworzyć łącze, które zawiera znacznik kotwicy (to znaczy kieruje użytkownika do strony i określonej sekcji strony).

Adres URL, który próbuję utworzyć, powinien wyglądać następująco:

<a href="/category/subcategory/1#section12">Title for a section on the page</a>

Mój routing jest skonfigurowany ze standardem:

routes.MapRoute("Default", "{controller}/{action}/{categoryid}"); 

Składnia łącza akcji, której używam, to:

<%foreach (Category parent in ViewData.Model) { %>
<h3><%=parent.Name %></h3>
<ul>
<%foreach (Category child in parent.SubCategories) { %>
    <li><%=Html.ActionLink<CategoryController>(x => x.Subcategory(parent.ID), child.Name) %></li>
<%} %>
</ul>
<%} %>

Moja metoda kontrolera jest następująca:

public ActionResult Subcategory(int categoryID)
{
   //return itemList

   return View(itemList);
}

Powyższe poprawnie zwraca adres URL w następujący sposób:

<a href="/category/subcategory/1">Title for a section on the page</a>

Nie mogę wymyślić, jak dodać część # section12 . Słowo „sekcja” jest po prostu konwencją, której używam do dzielenia sekcji strony, a 12 to identyfikator podkategorii, tj. Child.ID.

W jaki sposób mogę to zrobić?

dp.
źródło

Odpowiedzi:

97

Prawdopodobnie zbudowałbym link ręcznie, w ten sposób:

<a href="<%=Url.Action("Subcategory", "Category", new { categoryID = parent.ID }) %>#section12">link text</a>
LorenzCK
źródło
20
Powinien naprawdę używać przeciążeń dla ActionLink, zgodnie z opisem @Brad Wilson.
mattruma
18
@mattruma przepraszam, nie zgadzam się. POCAŁUNEK. Po co mieć element członkowski pełen parametrów, z których niektóre są pozostawione jako puste, skoro można po prostu określić to jawnie. Każdy może zobaczyć, co to oznacza, że ​​reakcja Brada jest zagmatwana i wymaga od ciebie zagłębienia się w inteligencję. Za dużo parametrów to rozpoznany anty-wzorzec. C2.com/cgi/wiki?TooManyParameters
Ed Blackburn
2
Zgadzam się. Obie metody działają, ale ponieważ sposób określania fragmentów w adresach URL nie zmieni się w najbliższej przyszłości, myślę, że ten sposób jest w rzeczywistości bardziej czytelny i bardziej przejrzysty. W razie potrzeby nadal można rozszerzyć obiekt Urllub Htmlza pomocą niestandardowej metody, która obejmuje prosty sposób dodawania ciągu fragmentów.
LorenzCK
282

Istnieją przeciążenia ActionLink, które pobierają parametr fragmentu . Przekazanie „sekcji 12” jako fragmentu zapewni ci zachowanie, którego szukasz.

Na przykład wywołanie metody LinkExtensions.ActionLink (HtmlHelper, String, String, String, String, String, String, Object, Object) :

<%= Html.ActionLink("Link Text", "Action", "Controller", null, null, "section12-the-anchor", new { categoryid = "blah"}, null) %>
Brad Wilson
źródło
1
Czy te przeciążenia są częścią biblioteki rozszerzeń? Wydaje się, że ich nie rozumiem.
granat
Istnieją dwa: publiczny ciąg statyczny ActionLink (ten HtmlHelper htmlHelper, string linkText, string actionName, string controllerName, string protocol, string hostName, fragment ciągu, object routeValues, obiekt htmlAttributes); public static string ActionLink (this HtmlHelper htmlHelper, string linkText, string actionName, string controllerName, string protocol, string hostName, string fragment, RouteValueDictionary routeValues, IDictionary <string, object> htmlAttributes);
Brad Wilson,
11
To powinna być odpowiedź.
Rubens Mariuzzo
1
Przeciążenia Html.ActionLink, które umożliwiają określenie kotwicy poprzez przekazanie fragmentu, wymuszają przekazanie kontrolera po nazwie. Nie podoba mi się to. Jeśli nazwa kontrolera jest niepoprawna, wystąpią wyjątki w czasie wykonywania zamiast błędów kompilacji.
R. Schreurs
1
@RobertMcKee, jeśli tekst linku jest czymś więcej niż tylko tekstem, Html.ActionLink()nie działałby w żadnym scenariuszu - musiałbyś użyć [email protected]()składni stylu.
Katstevens
15

Nie pamiętam, w której wersji ASP.NET MVC (uważam, że ASP.NET MVC 3+) / Razor parametrlabeldeclaration lub jak to się nazywa (parametr: x) została wprowadzona, ale dla mnie jest to zdecydowanie właściwy sposób skompiluj łącze z kotwicą w ASP.NET MVC.

@Html.ActionLink("Some link text", "MyAction", "MyController", protocol: null, hostName: null, fragment: "MyAnchor", routeValues: null, htmlAttributes: null)

Nawet argument anty-wzorcowy Eda Blackburnsa z tej odpowiedzi nie może z tym konkurować.

Kot w butach
źródło
1
Dosłownie to uratowało mi życie. Przypisywanie twojego postu jako mojego rozwiązania tutaj stackoverflow.com/questions/32420028/… .
Matthew
11

Po prostu zrobiłem to tak:

<a href="@Url.Action("Index","Home")#features">Features</a>
Zapnologica
źródło
1

Oto przykład z prawdziwego życia

@Html.Grid(Model).Columns(columns =>
    {
           columns.Add()
                   .Encoded(false)
                   .Sanitized(false)
                   .SetWidth(10)
                   .Titled(string.Empty)
                   .RenderValueAs(x => @Html.ActionLink("Edit", "UserDetails", "Membership", null, null, "discount", new { @id = @x.Id }, new { @target = "_blank" }));

  }).WithPaging(200).EmptyText("There Are No Items To Display")

A strona docelowa ma TABS

<ul id="myTab" class="nav nav-tabs" role="tablist">

        <li class="active"><a href="#discount" role="tab" data-toggle="tab">Discount</a></li>
    </ul>
Deweloper
źródło
0

Moje rozwiązanie zadziała, jeśli zastosujesz ActionFilter do metody akcji Subcategory, o ile zawsze chcesz przekierować użytkownika do tej samej zakładki:

http://spikehd.blogspot.com/2012/01/mvc3-redirect-action-to-html-bookmark.html

Modyfikuje bufor HTML i generuje mały fragment kodu JavaScript, aby poinstruować przeglądarkę, aby dodała zakładkę.

Możesz zmodyfikować javascript, aby ręcznie przewijał, zamiast oczywiście używać zakładki w adresie URL!

Mam nadzieję, że to pomoże :)

Spikeh
źródło
0

Zrobiłem to i działa przy przekierowaniu do innego widoku Myślę, że jeśli dodasz #sectionLink po To zadziała

<a class="btn yellow" href="/users/Create/@Model.Id" target="_blank">
                                        Add As User
                                    </a>
Ahmed Samir
źródło