2015-09-21 12 views
6

C'è un modo per ottenere un TagHelper per il rendering di un altro TagHelper?Chiamare TagHelpers da un altro TagHelper?

Tag di esempio;

public class OuterTagHelper : TagHelper 
{ 
    public override void Process(TagHelperContext context, TagHelperOutput output) 
    { 
     output.TagName = ""; 
     output.Content.SetContent("Hello <inner></inner>"); 
    } 
} 

public class InnerTagHelper : TagHelper 
{ 
    public override void Process(TagHelperContext context, TagHelperOutput output) 
    { 
     output.TagName = ""; 
     output.Content.SetContent("World!"); 
    } 
} 

Esempio di vista;

<outer></outer> 

Risultato previsto;

Hello World! 

so che probabilmente dovrebbe usare un ViewComponent invece, ma è a tutto il possibile per ottenere il comportamento previsto presentata sopra?

+1

Si potrebbe nidificarli nella vista rasoio come in [questa domanda] (http://stackoverflow.com/questions/32692857/nesting-taghelpers-in-asp-net-5-mvc-6), ma non penso che tu possa chiamare un altro modello all'interno del metodo di processo stesso. (Forse potresti accoppiarli e chiamare manualmente Process, ma non sembra una grande idea) –

risposta

1

@Daniel J.G. ha ragione, questo non è raccomandato. Tecnicamente è possibile farlo se si esegue nuovamente il contenuto attraverso il parser del rasoio altamente personalizzato e quindi eseguito il contenuto come se fosse una pagina, ma è quasi sicuramente l'approccio sbagliato al problema.

2

Se è necessario utilizzare alcune delle funzionalità del tipo di tag helper esistente, è possibile accedervi da IHtmlGenerator. Questo non aiuterà per accedere alle funzionalità di supporto tag personalizzato, ma se avete solo bisogno della funzionalità di cose esistenti, come l'etichetta, ingresso allora questo funzionerà

[HtmlTargetElement("input", Attributes = nameof(Wrap) + ", asp-for")] 
[HtmlTargetElement("select", Attributes = nameof(Wrap) + ", asp-for")] 
public class FormGroupWrapperTagHelper : TagHelper 
{ 
    public FormGroupWrapperTagHelper(IHtmlGenerator generator) 
    { 
     Generator = generator; 
    } 

    [HtmlAttributeNotBound] 
    [ViewContext] 
    public ViewContext ViewContext { get; set; } 

    protected IHtmlGenerator Generator { get; } 

    public ModelExpression AspFor { get; set; } 
    public override void Process(TagHelperContext context, TagHelperOutput output) 
    { 
     var generateValidationMessage = Generator.GenerateValidationMessage(ViewContext, 
                    AspFor.Name, 
                    message: null, 
                    tag: null, 
                    htmlAttributes: null); 
..... 
} 
Problemi correlati