Générer un lien contenant un fragment avec ASP.Net MVC Routelink
-
21-09-2019 - |
Question
J'essaie d'utiliser Html.RouteLink dans une vue pour générer un lien vers une ancre nommée sur une autre page.Il existe quelques définitions pour RouteLink qui incluent une option de fragment, mais j'essaie de comprendre s'il existe un autre moyen.
public static string RouteLink(
this HtmlHelper htmlHelper,
string linkText,
string routeName,
string protocol,
string hostName,
string fragment,
Object routeValues,
Object htmlAttributes
)
est la solution évidente, mais qui semble un peu maladroite.Je préférerais pouvoir faire quelque chose comme
Html.RouteLink("Looga", new { Controller = "Cooga", Action = "Aooga", Fragment = "Fooga" })
et avoir ce retour
<a href="/Cooga/Aooga#Fooga">Looga</a>
Est-ce possible ou dois-je spécifier chaque petite partie de l'URL pour obtenir un fragment à l'aide des assistants intégrés.Je pourrais aussi le faire manuellement comme
<a href="<%= Url.RouteUrl(new { Controller = "Cooga", Action = "Aooga" }) %>#Fooga>Looga</a>
mais il semble que quelque chose que RouteLink devrait être capable de gérer avec plus d'élégance.
La solution
Sous la direction de tenir compte des principales modifications post
Html.RouteLink (
"Looga",
nouveau {Controller = "Cooga", Action = "Aooga"},
nouveau {Fragment = "Fooga"})
Ce code produira un courant
<a href="/Cooga/Aooga" Fragment="Fooga">Looga</a>
Pas vraiment ce que vous voulez. Au lieu de cela, vous pouvez écrire votre propre méthode d'extension pour RouteLink, quelque chose comme ça ...
public static class RouteLinkExtensions
{
public static string RouteLink(
this HtmlHelper htmlHelper,
string linkText,
object routeValues,
string fragment)
{
// There's probably better ways to do the implementation, but you get the idea
var url = new UrlHelper(htmlHelper.ViewContext.RequestContext);
return string.Format("<a href=\"{0}#{1}>{2}</a>",
url.RouteUrl(routeValues),
fragment,
linkText);
}
}
Cela vous permettra d'utiliser un appel propre à RouteLink dans votre page: -)
Html.RouteLink(
"Looga",
new { Controller = "Cooga", Action = "Aooga" },
"Fooga")
Autres conseils
+1 à Russell.
Voici une version légèrement modifiée de son extension que j'ai modifiée pour l'adapter à mes besoins...j'ai pensé que je le publierais au cas où cela aiderait quelqu'un.
Modifications que j'ai apportées :
Il renvoie désormais une chaîne HTML plutôt qu'une chaîne afin que vous puissiez l'utiliser pour afficher le lien directement dans la page.
Je l'ai modifié pour accepter un nom de route plutôt qu'un objet routevalues
Je l'ai également modifié pour que si le fragment que vous transmettez est vide, il n'ajoute pas le « # »
public static class HtmlHelperRouteLinkExtension
{
public static IHtmlString RouteLink(
this HtmlHelper htmlHelper,
string linkText,
string routeName,
string fragment)
{
var url = new UrlHelper(htmlHelper.ViewContext.RequestContext);
return htmlHelper.Raw(string.Format("<a href=\"{0}{1}\">{2}</a>",
url.RouteUrl(routeName),
String.IsNullOrWhiteSpace(fragment) ? "" : "#" + fragment,
linkText));
}
}