2016-05-19 49 views
2

在RC1中,你可以建立一个新的TagBuilder,只是追加,为自定义TagHelper的输出,例如:ASP.NET核心RC2 TagHelperOutput.Content.Append改变

public override void Process(TagHelperContext context, TagHelperOutput output) 
{ 
    var indicator = new TagBuilder("span"); 
    indicator.AddCssClass("indicator"); 
    output.Content.Append(indicator); 
} 

那现在失败,RC2,因为TagHelperOutput.Content.Append()只接受string

我可以混淆TagBuilder.WriteTo(),但这看起来过于复杂。

有没有一种新的方式来构建新的标签,并附加到我错过的输出?

回答

4

在RC2可以使用

output.Content.AppendHtml(tag); 

菜单样本标签帮手:

观点:

<ul> 
    <menu action="Index" controller="Home">Home page</menu> 
    <menu action="List" controller="Home">List</menu> 
</ul> 

MenuTagHelper.cs:

[HtmlTargetElement(Attributes = "controller, action")] 
public class MenuTagHelper : TagHelper 
{ 
    public string Controller { get; set; } 
    public string Action { get; set; } 

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

    private readonly IUrlHelperFactory urlHelperFactory; 

    public MenuTagHelper(IUrlHelperFactory urlHelperFactory) 
    { 
     this.urlHelperFactory = urlHelperFactory; 
    } 

    public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output) 
    { 
     var sb = new StringBuilder(); 
     var urlHelper = urlHelperFactory.GetUrlHelper(ViewContext); 
     var url = urlHelper.Action(Action, Controller); 
     var text = (await output.GetChildContentAsync()).GetContent(); 

     output.TagName = "li"; 

     var a = new TagBuilder("a"); 
     a.MergeAttribute("href", $"{url}"); 
     a.MergeAttribute("title", text); 
     a.InnerHtml.Append(text); 

     var routeData = ViewContext.RouteData.Values; 
     var currentController = routeData["controller"]; 
     var currentAction = routeData["action"]; 

     if (string.Equals(Action, currentAction as string, StringComparison.OrdinalIgnoreCase) && string.Equals(Controller, currentController as string, StringComparison.OrdinalIgnoreCase)) 
      output.Attributes.Add("class", "active"); 

     output.Content.AppendHtml(a); 
    } 
}