HtmlTextWriter - Добавление нескольких классов в тег - PullRequest
2 голосов
/ 09 февраля 2012

Каков наилучший способ добавить несколько классов в тег с помощью 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");

Однако не всегда это так просто при динамическом построении элемента управления.Существуют ли альтернативные способы «добавления» классов к тегу?

Ответы [ 2 ]

3 голосов
/ 09 февраля 2012

почему бы не расширить класс Writer и не добавить к нему методы AddClass и RemoveClass, которые при рендеринге используют все добавленные имена классов. Внутренне вы можете использовать список _classNames для хранения, а затем присоединиться к ним

writer.AddAttribute (HtmlTextWriterAttribute.Class, string.Join (_classNames.ToArray (), "");

Надеюсь, это поможет!

1 голос
/ 10 июля 2012

Просто следуя предыдущей идее сообщения ...

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