2017-02-02 6 views
14

Ich bin kürzlich in eine Situation geraten, in der ich gerne einen Tag Helfer in einem Tag Helper verwenden würde. Ich schaute mich um und konnte niemanden finden, der das versuchte, ich benutzte eine schlechte Konvention oder fehlte mir Dokumentation?Kann ich einen Tag Helper in einem benutzerdefinierten Tag Helper verwenden, der HTML zurückgibt?

Ex. Tag Helper Ein gibt HTML aus, das einen anderen Tag Helfer 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()); 
    } 
} 

Gibt es eine Möglichkeit für mich, die <a asp-action> </a> Tag Helfer von C# zu verarbeiten? Oder um die Ausgabe HTML mit Tag-Helfern neu zu verarbeiten?

+0

Könnte das helfen? http://stackoverflow.com/questions/32692857/nesting-taghelpers-in-asp-net-core-mvc-6 – Vlince

+0

@Vlince Danke für den Link, aber nein, das ist nicht das, was ich suche, ich möchte ein einzelnes Eingabe-Tag haben, ohne andere verschachtelte Tags. Was ich wirklich gerne tun würde, ist, einen Tag-Helfer von einem anderen zu rufen. –

+0

Sie suchen nach [Komponenten anzeigen] (http://www.davepaquette.com/archive/2016/01/02/goodbye-child-actions-hello-view-components.aspx)? –

Antwort

9

Nein, Sie können nicht. TagHelpers sind eine Razor-Parser-Zeitfunktion.

Eine Alternative ist das Erstellen eines TagHelper und das manuelle Aufrufen seiner ProcessAsync/Process-Methode. 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

Was für ein Chaos, es ist bedauerlich, wenn das der einzige Weg ist, dies zu tun. Ich werde diese Frage für einen Tag oder so offen lassen, nur um zu bestätigen, dass dies die Art ist, wie ich es tun müsste. Wenn es keine andere Antwort gibt, werde ich das sicherlich akzeptieren. Danke –

+0

Ich denke, diese Antwort ist großartig. Für alles, was fortgeschritten ist, sind View-Komponenten der richtige Weg. Für Ihren Fall, verwenden Sie einfach den 'UrlHelper' direkt könnte besser sein @JacobLinney –

+0

@ChristianGollhardt Vielen Dank für Ihre Meinung und Anregung; Ich möchte nur bestätigen, dass es keinen besseren Weg dafür gibt. Und das war nicht mein tatsächlicher Anwendungsfall, nur eine Abstraktion. –

2

Ich weiß nicht, ob dies für Ihr Szenario funktioniert, aber es ist möglich, von der AnchorTagHelper zu erben und dann tun Sie Ihre Anpassungen wie diese.

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 verwenden, um mit all den eingebauten Güte des Standard AnchorTagHelper.

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