tag route net mvc form asp c# asp.net asp.net-mvc asp.net-core-mvc tag-helpers

c# - route - ¿Puedo usar un Tag Helper en un Tag Helper personalizado que devuelve html?



tag helper input (3)

Recientemente me encontré con una situación en la que me gustaría usar un ayudante de etiquetas dentro de un ayudante de etiquetas. Miré a mi alrededor y no pude encontrar a nadie más que tratara de hacer esto, ¿estoy usando una convención deficiente o me falta documentación?

Ex. El Ayudante de etiquetas A genera un código HTML que contiene otro ayudante de etiquetas.

Ex.

[HtmlTargetElement("tag-name")] public class RazorTagHelper : TagHelper { public override void Process(TagHelperContext context, TagHelperOutput output) { StringBuilder sb = new StringBuilder(); sb.Append("<a asp-action=/"Home/" "); output.Content.SetHtmlContent(sb.ToString()); } }

¿Hay alguna manera de que pueda procesar el ayudante de etiquetas <a asp-action> </a> de C #? ¿O para reprocesar el HTML de salida con ayudantes de etiqueta?


No sé si esto funciona para su escenario, pero es posible heredar de AnchorTagHelper y luego hacer sus personalizaciones de esta manera.

public class TestTagHelper : AnchorTagHelper { public TestTagHelper(IHtmlGenerator htmlGenerator) : base(htmlGenerator) { } public async override Task ProcessAsync(TagHelperContext context, TagHelperOutput output) { // Replaces <test> with <a> tag output.TagName = "a"; //do custom processing output.Attributes.SetAttribute("class", "custom-class"); //let the base class generate the href base.ProcessAsync(context, output); } }

Luego, puede usar este ayudante de etiquetas en su vista con todas las bondades AnchorTagHelper predeterminado.

<test asp-action="Index" asp-route-id="5"></test>


No, no puedes. Los TagHelpers son una característica de tiempo de análisis de Razor.

Una alternativa es crear un TagHelper e invocar manualmente su método ProcessAsync / Process. Aka:

var anchorTagHelper = new AnchorTagHelper { Action = "Home", }; var anchorOutput = new TagHelperOutput("a", new TagHelperAttributeList(), (useCachedResult, encoder) => new HtmlString()); var anchorContext = new TagHelperContext( new TagHelperAttributeList(new[] { new TagHelperAttribute("asp-action", new HtmlString("Home")) }), new Dictionary<object, object>(), Guid.NewGuid()); await anchorTagHelper.ProcessAsync(anchorContext, anchorOutput); output.Content.SetHtmlContent(anchorOutput);


Si alguien está buscando reutilizar los ayudantes de etiquetas incorporados desde el núcleo de asp.net, puede usar el generador IHtml en su lugar. Para reutilizar otros tipos de ayudantes de etiquetas, no he encontrado una opción más sencilla que la @N. Respuesta de taylor mullen

Aquí es cómo reutilizar el ayudante de la etiqueta asp-action:

[HtmlTargetElement("helplink")] public class RazorTagHelper : TagHelper { private readonly IHtmlGenerator _htmlGenerator; public RazorTagHelper(IHtmlGenerator htmlGenerator) { _htmlGenerator = htmlGenerator; } [ViewContext] public ViewContext ViewContext { set; get; } public override void Process(TagHelperContext context, TagHelperOutput output) { output.TagName = "div"; output.TagMode = TagMode.StartTagAndEndTag; var actionAnchor = _htmlGenerator.GenerateActionLink( ViewContext, linkText: "Home", actionName: "Index", controllerName: null, fragment: null, hostname: null, htmlAttributes: null, protocol: null, routeValues: null ); var builder = new HtmlContentBuilder(); builder.AppendHtml("Here''s the link: "); builder.AppendHtml(actionAnchor); output.Content.SetHtmlContent(builder); } }