wake-up-neo.net

Kann ich einen Tag-Helper in einem benutzerdefinierten Tag-Helper verwenden, der HTML zurückgibt?

Ich bin kürzlich auf eine Situation gestoßen, in der ich einen Tag-Helfer in einem Tag-Helfer verwenden möchte. Ich habe mich umgesehen und konnte niemanden finden, der dies versucht, verwende ich eine schlechte Konvention oder vermisse ich Unterlagen?

Ex. Tag Helper A gibt HTML aus, das einen anderen Tag-Helper enthält.

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

Kann ich den <a asp-action> </a>-Tag-Helfer in C # verarbeiten? Oder um den Ausgabe-HTML-Code mit Tag-Helfern erneut zu verarbeiten?

19
Jacob Linney

Nein, du kannst nicht. TagHelper sind eine Funktion zum Parsen der Zeit beim Rasieren.

Eine Alternative besteht darin, einen TagHelper zu erstellen und seine ProcessAsync/Process-Methode manuell aufzurufen. 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);
14

Ich weiß nicht, ob dies für Ihr Szenario funktioniert, aber es ist möglich, vom AnchorTagHelper zu erben und dann Ihre Anpassungen wie folgt vorzunehmen.

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

Dann können Sie einfach diesen Tag-Helfer in Ihrer Ansicht mit der integrierten Güte des Standardwerts AnchorTagHelper verwenden.

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

Wenn jemand die integrierten Tag-Helfer von asp.net core wiederverwenden möchte, kann er stattdessen den IHtmlGenerator verwenden. Für die Wiederverwendung anderer Tag-Hilfetypen habe ich keine einfachere Option als @N gefunden. Taylor Mullen antwortet

So können Sie den asp-action-Tag-Helfer wiederverwenden:

[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