2017-02-02 31 views
14

Niedawno natknąłem się na sytuację, w której chciałbym użyć pomocnika znacznika w pomocniku znacznika. 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?Czy mogę użyć pomocnika tagów w niestandardowym pomocniku tagów, który zwraca kod HTML?

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

Przykł.

[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 dla mnie, aby przetworzyć pomocnika <a asp-action> </a> tag z C#? Lub przerobić wyjściowy kod HTML za pomocą pomocników tagów?

+0

Czy to może pomóc? http://stackoverflow.com/questions/32692857/nesting-taghelpers-in-asp-net-core-mvc-6 – Vlince

+0

@Vlince Dzięki za link, ale nie to nie jest to, co chcę 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. –

+0

Przez przypadek szukasz [Wyświetl komponenty] (http://www.davepaquette.com/archive/2016/01/02/goodbye-child-actions-hello-view-components.aspx)? –

Odpowiedz

9

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. 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); 
+0

Co za bałagan, to niefortunne, jeśli jest 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ę –

+0

Myślę, że ta odpowiedź jest świetna. Do wszystkiego, co jest zaawansowane, komponenty widoku są drogą do zrobienia. Dla twojego przypadku, proste użycie 'UrlHelper' bezpośrednio może być lepsze @JacobLinney –

+0

@ 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. –

2

Nie wiem, czy to działa dla scenariusza, ale jest możliwe do dziedziczą z AnchorTagHelper a następnie zrobić swoje dostosowywać tak.

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żna po prostu użyć tego tagu pomocnika w widoku z wszystkich wbudowanych dobroci domyślnie AnchorTagHelper.

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