web-dev-qa-db-fra.com

Puis-je utiliser un assistant de tag dans un assistant de tag personnalisé qui renvoie du code HTML?

J'ai récemment rencontré une situation dans laquelle j'aimerais utiliser un assistant de tag dans un assistant de tag. J'ai regardé autour de moi et je n'ai trouvé personne d'autre qui essaie de faire cela. Est-ce que j'utilise une mauvaise convention ou est-ce que je manque de documentation?

Ex. Tag Helper A génère un HTML contenant un autre tag helper.

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

Est-il possible pour moi de traiter l'assistant de balise <a asp-action> </a> à partir de C #? Ou pour retraiter le code HTML de sortie avec des aides de balises?

19
Jacob Linney

Non vous ne pouvez pas. TagHelpers est une fonctionnalité de temps d'analyse Razor. 

Une alternative consiste à créer un TagHelper et à appeler manuellement sa méthode ProcessAsync/Process. Alias:

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);
14
N. Taylor Mullen

Je ne sais pas si cela fonctionne pour votre scénario, mais il est possible d'hériter de AnchorTagHelper, puis d'effectuer vos personnalisations comme ceci.

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

Ensuite, vous pouvez simplement utiliser cette aide de balise dans votre vue avec toute la qualité intégrée de la valeur par défaut AnchorTagHelper.

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

Si quelqu'un cherche à réutiliser les aides de balises intégrées à partir d'asp.net core, vous pouvez utiliser IHtmlGenerator à la place. Pour réutiliser d'autres types d'auxiliaires de tag, je n'ai pas trouvé d'option plus simple que @N. Taylor Mullen répondre

Voici comment réutiliser l'assistant de balise 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);
    }
}
0
Gorgi Rankovski