2012-02-09 106 views
1

使用HtmlTextWriter向标记中添加多个类的最佳方法是什么?HtmlTextWriter - 将多个类添加到标记

我想要做的是一样的东西......

writer.AddAttribute(HtmlTextWriterAttribute.Class, "Class1"); 
writer.AddAttribute(HtmlTextWriterAttribute.Class, "Class2"); 
writer.RenderBeginTag(HtmlTextWriterTag.Table); 

从而造成...

<table class="Class1 Class2"> 

我很感激我能做到......

writer.AddAttribute(HtmlTextWriterAttribute.Class, "Class1 Class2"); 

但是,动态构建控件时并不总是这样简单。是否有其他方法“追加”类到标签?

回答

3

为什么不扩展编写器类并在其上添加AddClass和RemoveClass方法,该方法在呈现时使用所有添加的类名称。在内部,你可以使用一个列表_classNames持有再后来又刚刚加入他们

writer.AddAttribute(HtmlTextWriterAttribute.Class,的string.join(_classNames.ToArray(),““);

希望帮助

1

只是遵循上一篇文章的想法....

public class NavHtmlTextWritter : HtmlTextWriter 
{ 
    private Dictionary<HtmlTextWriterAttribute, List<string>> attrValues = new Dictionary<HtmlTextWriterAttribute, List<string>>(); 
    private HtmlTextWriterAttribute[] multiValueAttrs = new[] { HtmlTextWriterAttribute.Class }; 

    public NavHtmlTextWritter (TextWriter writer) : base(writer) { } 

    public override void AddAttribute(HtmlTextWriterAttribute key, string value) 
    { 
     if (multiValueAttrs.Contains(key)) 
     { 
      if (!this.attrValues.ContainsKey(key)) 
       this.attrValues.Add(key, new List<string>()); 

      this.attrValues[key].Add(value); 
     } 
     else 
     { 
      base.AddAttribute(key, value); 
     } 
    } 

    public override void RenderBeginTag(HtmlTextWriterTag tagKey) 
    { 
     this.addMultiValuesAttrs(); 
     base.RenderBeginTag(tagKey); 
    } 

    public override void RenderBeginTag(string tagName) 
    { 
     this.addMultiValuesAttrs(); 
     base.RenderBeginTag(tagName); 
    } 

    private void addMultiValuesAttrs() 
    { 
     foreach (var key in this.attrValues.Keys) 
      this.AddAttribute(key.ToString(), string.Join(" ", this.attrValues[key].ToArray())); 

     this.attrValues = new Dictionary<HtmlTextWriterAttribute, List<string>>(); 
    } 
}