Inclure une balise d'ancrage dans un Html.ActionLink ASP.NET MVC

151

Dans ASP.NET MVC, j'essaie de créer un lien qui inclut une balise d'ancrage (c'est-à-dire, diriger l'utilisateur vers une page et une section spécifique de la page).

L'URL que j'essaie de créer doit ressembler à ceci:

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

Mon routage est mis en place avec le standard:

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

La syntaxe du lien d'action que j'utilise est:

<%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>
<%} %>

Ma méthode de contrôleur est la suivante:

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

   return View(itemList);
}

Ce qui précède renvoie correctement une URL comme suit:

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

Je n'arrive pas à comprendre comment ajouter la partie # section12 . Le mot «section» est simplement la convention que j'utilise pour séparer les sections de page, et le 12 est l'ID de la sous-catégorie, c'est-à-dire child.ID.

Comment puis-je faire ceci?

dp.
la source

Réponses:

97

Je créerais probablement le lien manuellement, comme ceci:

<a href="<%=Url.Action("Subcategory", "Category", new { categoryID = parent.ID }) %>#section12">link text</a>
LorenzCK
la source
20
Devrait vraiment utiliser les surcharges pour ActionLink comme décrit par @Brad Wilson.
mattruma
18
@mattruma désolé, je ne suis pas d'accord. BAISER. Pourquoi avoir un membre plein de paramètres, dont certains sont laissés comme null, alors que vous pouvez simplement le déclarer explicitement. Tout le monde peut voir ce que signifie ce qui précède, par lequel la réponse de Brad est alambiquée et vous oblige à creuser dans l'intellisense. Trop de paramètres est un motif anti reconnu. C2.com/cgi/wiki?TooManyParameters
Ed Blackburn
2
Je suis d'accord. Les deux méthodes fonctionnent, mais comme la façon dont les fragments sont spécifiés dans les URL ne va pas changer dans un proche avenir, je pense que cette manière est en fait plus lisible et plus claire dans son intention. Si nécessaire, vous pouvez toujours étendre l' objet Urlou Htmlavec une méthode personnalisée qui inclut un moyen simple d'ajouter une chaîne de fragment.
LorenzCK
282

Il y a des surcharges d'ActionLink qui prennent un paramètre de fragment . Passer "section12" comme votre fragment vous donnera le comportement que vous recherchez.

Par exemple, en appelant la méthode 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
la source
1
Ces surcharges font-elles partie d'une bibliothèque d'extensions? Je ne semble pas les avoir.
grenade
Il y en a deux: la chaîne statique publique ActionLink (this HtmlHelper htmlHelper, string linkText, string actionName, string controllerName, string protocol, string hostName, string fragment, object routeValues, object htmlAttributes); chaîne statique publique ActionLink (this HtmlHelper htmlHelper, string linkText, string actionName, string controllerName, string protocol, string hostName, string fragment, RouteValueDictionary routeValues, IDictionary <string, object> htmlAttributes);
Brad Wilson du
11
Cela devrait être la réponse.
Rubens Mariuzzo
1
Les surcharges de Html.ActionLink qui permettent de spécifier une ancre en passant le fragment, vous obligent à passer le contrôleur par son nom. Je n'aime pas ça. Si le nom du contrôleur est incorrect, des exceptions d'exécution se produiront, plutôt que des erreurs de compilation.
R. Schreurs
1
@RobertMcKee si le texte de votre lien est plus qu'un simple texte, il Html.ActionLink()ne fonctionnerait dans aucun scénario - vous auriez besoin d'utiliser [email protected]()une syntaxe de style.
Katstevens
15

Je ne me souviens pas dans quelle version d'ASP.NET MVC (ASP.NET MVC 3+ je crois) / Razor la déclaration de paramètre ou quoi que ce soit qui s'appelle (paramètre: x) a été introduite, mais pour moi, c'est certainement la bonne façon de créer un lien avec une ancre dans ASP.NET MVC.

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

Même l'argument anti-modèle d'Ed Blackburn à partir de cette réponse ne peut rivaliser avec cela.

Chat Botté
la source
1
Littéralement, cela m'a sauvé la vie. Attribuer votre message comme ma solution ici stackoverflow.com/questions/32420028/… .
Matthew
11

Je l'ai juste fait comme ceci:

<a href="@Url.Action("Index","Home")#features">Features</a>
Zapnologica
la source
1

Voici l'exemple réel

@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")

Et la page cible a 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>
Développeur
la source
0

Ma solution fonctionnera si vous appliquez l'ActionFilter à la méthode d'action Sous-catégorie, tant que vous souhaitez toujours rediriger l'utilisateur vers le même signet:

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

Il modifie le tampon HTML et génère un petit morceau de javascript pour demander au navigateur d'ajouter le signet.

Vous pouvez modifier le javascript pour faire défiler manuellement, au lieu d'utiliser un signet dans l'URL, bien sûr!

J'espère que ça aide :)

Spikeh
la source
0

Je l'ai fait et cela fonctionne pour rediriger vers une autre vue, je pense que si vous ajoutez le #sectionLink après cela fonctionnera

<a class="btn yellow" href="/users/Create/@Model.Id" target="_blank">
                                        Add As User
                                    </a>
Ahmed Samir
la source