2016-07-11 23 views
7

Jestem trochę zmieszany z zachowaniem TagHelper wprowadzonym w ASP.NET Core MVC. Po tym samouczku A working email Tag Helper mamy możliwość napisania samozamykających się tagów. Zgodnie z artykułem w tym celu powinniśmy używać attbute HtmlTargetElement. Klasa poniżej demostrated jako przykład:Samozamykający TagHelper scala znaczniki html elementu rodzeństwa

[HtmlTargetElement("email", TagStructure = TagStructure.WithoutEndTag)] 
public class EmailTagHelper : TagHelper 
{ 
    private const string EmailDomain = "contoso.com"; 
    public string MailTo { get; set; } 
    public override void Process(TagHelperContext context, TagHelperOutput output) 
    { 
     output.TagName = "a"; 
     var address = MailTo + "@" + EmailDomain; 
     output.Attributes.SetAttribute("href", "mailto:" + address); 
     output.Content.SetContent(address); 
    } 
} 

Znaczniki w brzytwa widok jak:

<strong>Support:</strong> 
    <email mail-to="Support"/><br /> 
<strong>Marketing:</strong> 
    <email mail-to="Marketing"/> 

Ale mam nieoczekiwane wyjście:

<strong>Support:</strong> 
<a href="mailto:[email protected]"> 
    <span>Another content</span> 
    <strong>Marketing:</strong> 
</a> 
<a href="mailto:[email protected]"></a> 

Dlaczego pierwszy znacznik kotwicy zawiera <span> i <strong> treść tagów?
Bez atrybutu HtmlTargetElement i ze znacznikami zamykającymi </email> w widoku maszynowym Mam prawidłowe zachowanie.

Odpowiedz

2

Uruchomiłem ten sam przykład i mogłem wytworzyć ten sam problem. Podczas debugowania zauważyłem, że domyślnie TagMode wyjścia ma ustawioną opcję SelfClosing. Nie dotyczy to znacznika zakotwiczenia. Następnie ustawiłem tryb znacznika dla kotwicy na StartTagAndEndTag, a wynik został wygenerowany zgodnie z oczekiwaniami.

public override void Process(TagHelperContext context, TagHelperOutput output) 
{ 
    output.TagName = "a"; 

    // ADD THIS LINE TO YOUR CODE 
    output.TagMode = TagMode.StartTagAndEndTag; 

    var address = MailTo + "@" + EmailDomain; 
    output.Attributes.SetAttribute("href", "mailto:" + address); 
    output.Content.SetContent(address); 
} 

Ta maszynka:

<strong>Support:</strong><email mail-to="Support" /><br /> 
<strong>Marketing:</strong><email mail-to="Marketing" /> 

wyprodukowały to wynik:

<strong>Support:</strong><a href="mailto:[email protected]">[email protected]</a><br /> 
<strong>Marketing:</strong><a href="mailto:[email protected]">[email protected]</a> 
Powiązane problemy