2016-07-11 1 views
7

Я смущен с поведением TagHelper, интродуцированным в ASP.NET Core MVC. После этого урока A working email Tag Helper у нас появилась возможность писать самозакрывающиеся теги. Согласно статье для этой цели, мы должны использовать attbute HtmlTargetElement. Класс ниже продемонстрировало, как пример:Self-closed TagHelper объединяет html-разметку элемента sibling

[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); 
    } 
} 

Разметка с точки зрения бритвы, как:

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

Но у меня есть неожиданный выход:

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

Почему первый якорь тег содержит <span> и <strong> содержание тегов?
Без атрибута HtmlTargetElement и с закрывающими тегами </email> в режиме бритвы У меня правильное поведение.

ответ

2

Я выполнил этот же пример и смог выполнить эту же проблему. При отладке я заметил, что по умолчанию для TagMode на выходе установлено значение SelfClosing. Это неверно для тега привязки. Затем я установил режим тега для привязки к StartTagAndEndTag, и результат был сгенерирован, как и ожидалось.

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); 
} 

Эта бритва:

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

Выпускается этот вывод:

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