Crea un ActionLink con elementi HTML nel testo del link
-
03-07-2019 - |
Domanda
In una vista MVC ASP.NET vorrei includere un collegamento del modulo:
<a href="blah">Link text <span>with further descriptive text</span></a>
Cercare di includere l'elemento <span>
nel campo linkText
di una chiamata a Html.ActionLink()
finisce per essere codificato (come ci si aspetterebbe).
Esistono modi consigliati per raggiungere questo obiettivo?
Soluzione
Puoi usare Url.Action per creare il link per te:
<a href="<% =Url.Action("Action", "Controller")%>">link text <span>with further blablah</span></a>
o usa Html.BuildUrlFromExpression:
<a href="<% =Html.BuildUrlFromExpression<Controller>(c => c.Action()) %>">text <span>text</span></a>
Altri suggerimenti
se ti piace usare Razor, questo dovrebbe funzionare:
<a href="@Url.Action("Action", "Controller")">link text <span>with further blablah</span></a>
Un'altra opzione è quella di rendere il link dell'azione a un MvcHtmlString come di consueto, usando HTML.ActionLink o Ajax.ActionLink (a seconda del contesto), quindi scrivere una classe che prende il MvcHtmlString renderizzato e compromette il testo del collegamento HTML direttamente nel MvcHtmlString già reso e restituisce un altro MvcHtmlString.
Quindi questa è la classe che lo fa: [si noti che il codice di inserimento / sostituzione è MOLTO semplice e potrebbe essere necessario potenziarlo per gestire più html nidificati]
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);
}
}
}
E poi lo useresti nella vista in questo modo:
@Bonk.Framework.CustomHTML.AddLinkText(Ajax.ActionLink("text to be replaced", "DeleteNotificationCorporateRecipient"), @"Link text <span>with further descriptive text</span>")
Questo approccio ha il vantaggio di non dover riprodurre / comprendere il processo di rendering dei tag.