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.

Était-ce utile?

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)); } }

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top