web-dev-qa-db-fra.com

Créer un ActionLink avec des éléments HTML dans le texte du lien

Dans une vue ASP.NET MVC, j'aimerais inclure un lien de la forme suivante:

<a href="blah">Link text <span>with further descriptive text</span></a>

Essayer d'inclure l'élément <span> dans le champ linkText d'un appel à Html.ActionLink() aboutit à son codage (comme on pouvait s'y attendre).

Existe-t-il des moyens recommandés pour y parvenir?

32
Giraffe

Vous pouvez utiliser Url.Action pour créer le lien pour vous:

<a href="<% =Url.Action("Action", "Controller")%>">link text <span>with further blablah</span></a>

ou utilisez Html.BuildUrlFromExpression:

<a href="<% =Html.BuildUrlFromExpression<Controller>(c => c.Action()) %>">text <span>text</span></a>
50
Casper

si vous aimez utiliser Razor, cela devrait fonctionner:

<a href="@Url.Action("Action", "Controller")">link text <span>with further blablah</span></a>
41
dplante

Une autre option consiste à rendre le lien de votre action en chaîne MvcHtmlString comme d'habitude, en utilisant HTML.ActionLink ou Ajax.ActionLink (selon votre contexte), puis en écrivant une classe qui récupère la chaîne de rendu MvcHtmlString et hacks a déjà rendu MvcHtmlString et retourne un autre MvcHtmlString.

C'est donc la classe qui fait cela: [notez s'il vous plaît que le code d'insertion/substitution est TRÈS simple, et vous devrez peut-être le renforcer pour gérer plus de html imbriqué]

namespace Bonk.Framework
{
    public class CustomHTML
    {
        static public MvcHtmlString AddLinkText(MvcHtmlString htmlString, string linkText)
        {
            string raw = htmlString.ToString();

            string left = raw.Substring(0, raw.IndexOf(">") + 1);
            string right = raw.Substring(raw.LastIndexOf("<"));

            string composed = left + linkText + right;

            return new MvcHtmlString(composed);
        }
    }
}

Et vous l'utiliseriez dans la vue comme ceci:

@Bonk.Framework.CustomHTML.AddLinkText(Ajax.ActionLink("text to be replaced", "DeleteNotificationCorporateRecipient"), @"Link text <span>with further descriptive text</span>")

Cette approche a l'avantage de ne pas avoir à reproduire/comprendre le processus de rendu des balises.

0
david.barkhuizen