2016-07-11 13 views
7

私はASP.NETコアMVCにintuchucedのTagHelperの動作と混乱しています。このチュートリアルA working email Tag Helperに続いて、自己終了タグを書く機会があります。この目的のための記事によると、私たちはattbute HtmlTargetElementを使うべきです。クラスは以下の例のようにdemostratedさ:セルフクローズTagHelperは、兄弟要素のhtmlマークアップをマージします

[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><a href="mailto:[email protected]">[email protected]</a><br /> 
<strong>Marketing:</strong><a href="mailto:[email protected]">[email protected]</a> 

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

は、この出力をプロデュース

関連する問題