2015-11-11 21 views
5

Ho cercato esempi su taghelpers su google ma non sono riuscito a trovare alcun esempio che sto cercando.Come scrivere un taghelper ASP.NET 5 personalizzato che contiene altri tagheler

ho il seguente codice:

<div class="form-group"> 
    <label asp-for="PersonName" class="col-md-2 control-label"></label> 
    <div class="col-md-10"> 
     <input asp-for="PersonName" class="form-control" /> 
     <span asp-validation-for="PersonName" class="text-danger"></span> 
    </div> 
</div> 

Cosa mi aspetto da fare è sostituirlo con qualcosa di simile a

<bootstraprow asp-for="PersonName"></bootstraprow> 

Tuttavia non sono sicuro di scrivere un taghelper che contiene altri taghelpers

  1. È possibile?
  2. Se possibile fornire esempio di codice per quanto sopra

Edit: Non è lo stesso di memorizzazione variables in taghelpers personalizzati ma voglio chiamare altri taghelpers personalizzate o taghelpers esistenti.

+0

Eventuali duplicati di [TagHelpers Nesting in ASP.NET 5 MVC 6] (http://stackoverflow.com/questions/32692857/nesting-taghelpers-in-asp-net-5-mvc-6) –

+0

Non è un duplicato. Il "possibile duplicato" menziona solo la nidificazione di TagHelpers. Questo riguarda TagHelpers che genera markup che sarà gestito da un altro TagHelper. Al momento non è possibile. –

+0

Si sta chiedendo se è possibile scrivere helper di tag che contengono altri helper di tag e, in tal caso, fornire un esempio. A mio parere, la domanda correlata copre entrambi. –

risposta

1

Se controlliamo ciò che avete, l'unica proprietà che state usando è PersonName. Per quanto riguarda il markup stesso, tutto il resto è buono HTML vecchio.

Quindi non è necessario sostituire nulla. Quello di cui hai bisogno è avere un costruttore che ha una dipendenza su IHtmlGenerator. Questo verrà automaticamente iniettato e sarai in grado di generare i diversi tag in base al tuo modello.

Rilevante IHtmlGenerator Firma:

public interface IHtmlGenerator 
{ 
    ... 

    TagBuilder GenerateValidationMessage(
     ViewContext viewContext, 
     string expression, 
     string message, 
     string tag, 
     object htmlAttributes); 
    TagBuilder GenerateLabel(
     ViewContext viewContext, 
     ModelExplorer modelExplorer, 
     string expression, 
     string labelText, 
     object htmlAttributes); 
    TagBuilder GenerateTextBox(
     ViewContext viewContext, 
     ModelExplorer modelExplorer, 
     string expression, 
     object value, 
     string format, 
     object htmlAttributes); 
    ... 
} 

E questo è tutto!

Ecco un po 'di codice che avrebbe catturare il tag di base:

[HtmlTargetElement("bootstraprow")] 
public BootstrapRowTagHelper: TagHelper 
{ 
    protected IHtmlGenerator Generator { get; set; } 
    public InputTagHelper(IHtmlGenerator generator) 
    { 
     Generator = generator; 
    } 

    [HtmlAttributeName("asp-for")] 
    public ModelExpression For { get; set; } 

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

    public override void Process(TagHelperContext context, TagHelperOutput output) 
    { 
     //todo: write your html generating code here. 
    } 
} 

Ecco un pronti contro termine con codice di esempio che genera Bootstrap HTML da TagHelpers:

https://github.com/dpaquette/TagHelperSamples/blob/master/TagHelperSamples/src/TagHelperSamples.Bootstrap/

+1

Puoi fornire il codice per fare riferimento a quanto sopra in cshtml? – d234