Pytanie Czy mogę użyć pomocnika tagów w niestandardowym pomocniku tagów, który zwraca kod HTML?


Niedawno natknąłem się na sytuację, w której chciałbym użyć pomocnika tagów w pomocniku znaczników. Rozejrzałem się i nie mogłem znaleźć nikogo, kto próbowałby to zrobić, czy używam słabej konwencji, czy też brakuje mi dokumentacji?

Dawny. Tag Helper A generuje HTML, który zawiera innego pomocnika tagu.

Dawny.

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

Czy istnieje sposób, aby przetworzyć to <a asp-action> </a> pomocnik tagów z C #? Lub przerobić wyjściowy kod HTML za pomocą pomocników tagów?


16
2018-02-02 19:10


pochodzenie


Czy to może być jakaś pomoc? stackoverflow.com/questions/32692857/... - Vlince
@Vlince Dzięki za link, ale nie to nie jest to, co zamierzam zrobić, chciałbym mieć pojedynczy tag wejściowy, bez innych zagnieżdżonych tagów. To, co naprawdę chciałbym zrobić, to wywołać jednego pomocnika tagu od drugiego. - Jacob Linney
Przez przypadek, którego szukasz Wyświetl komponenty? - Christian Gollhardt
Zobacz komponenty mogą działać w tym scenariuszu, ale naprawdę chciałbym zachować składnię znaczników HTML, jeśli to możliwe - Jacob Linney


Odpowiedzi:


Nie, nie możesz. TagHelpers to funkcja czasu parsowania.

Jedną z możliwości jest utworzenie TagHelper i ręczne wywołanie metody ProcessAsync / Process. Znany jako:

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

10
2018-02-02 19:42



Co za bałagan, to niefortunne, jeśli to jedyny sposób, aby to zrobić. Mam zamiar pozostawić to pytanie otwarte przez dzień lub dłużej, tylko po to, aby potwierdzić, że tak właśnie powinienem to zrobić. Jeśli nie ma innej odpowiedzi, z pewnością ją zaakceptuję. Dziękuję Ci - Jacob Linney
Myślę, że ta odpowiedź jest świetna. Do wszystkiego, co jest zaawansowane, komponenty widoku są drogą do zrobienia. Dla twojego przypadku, po prostu użyj UrlHelper bezpośrednio może być lepszy @JacobLinney - Christian Gollhardt
@ ChristianGollhardt Dziękujemy za opinie i sugestie; Chcę tylko potwierdzić, że nie ma lepszego sposobu na zrobienie tego. I to nie był mój faktyczny przypadek użycia, tylko abstrakcja. - Jacob Linney


Nie wiem, czy to działa w twoim scenariuszu, ale możliwe jest dziedziczenie po AnchorTagHelper, a następnie dostosowywanie w ten sposób.

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

Następnie możesz po prostu użyć tego pomocnika znaczników w widoku z wbudowaną dobrością domyślną AnchorTagHelper.

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

2
2017-10-16 15:30





Jeśli ktoś chce ponownie użyć wbudowanych pomocników tagów z rdzenia asp.net, możesz zamiast tego użyć narzędzia IHtmlGenerator. Aby ponownie użyć innych typów pomocników tagów, nie znalazłem prostszej opcji niż @N. Odpowiedź Taylora Mullena

Oto jak ponownie użyć pomocnika znacznika 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
2018-05-08 21:52