В C# многоуровневый HTML-код TagBuilder объект - Дизайн Шаблон нужен


Я считаю TagBuilder, написанных на C# бедненький без способности "хозяина" внутри него вложенные теги (как объекты, а не как строки).

Поэтому я написал простой класс, который наследует TagBuilder и позволяют сохранить вложенные теги. Я могу перемещаться внутри него и добавить вещи к нему, пока я перевожу через приложение. И когда я называю объект верхнего тега .Метод toString, он будет обрабатывать весь HTML

public class MultiLevelHtmlTag : TagBuilder
{
    public MultiLevelHtmlTag(string tagName) : base(tagName) { }

    public List<MultiLevelHtmlTag> InnerTags = new List<MultiLevelHtmlTag>();



    public override string ToString()
    {
        if (InnerTags.Count > 0)
        {
            foreach (MultiLevelHtmlTag tag in InnerTags)
            {
                this.InnerHtml += tag.ToString();
            }
        }
        return base.ToString();
    }
}

это, как я использую это:

MultiLevelHtmlTag top = new MultiLevelHtmlTag("div");
top.InnerTags.Add(new MultiLevelHtmlTag("span"));
log.Debug(top.ToString());

выход:

<div><span></span></div>

Что вы думаете об этом? это образец точной?



4384
5
задан 22 октября 2011 в 03:10 Источник Поделиться
Комментарии
1 ответ

Я хотел убедиться, что список не подвергается публично - абонент может делать все, что они хотят с этим списком, даже присвоить значение null , чтобы он. Так что я рефакторинг это немного и реализованы добавить() (вы можете также хотеть реализовать удалить()и т. д.):

/// <summary>
/// Simple class that inherits TagBuilder and allow to save sub tags.
/// </summary>
public class MultiLevelHtmlTag : TagBuilder
{
/// <summary>
/// List of inner tags.
/// </summary>
private readonly IList<MultiLevelHtmlTag> innerTags = new List<MultiLevelHtmlTag>();

/// <summary>
/// Initializes a new instance of the <see cref="MultiLevelHtmlTag"/> class.
/// </summary>
/// <param name="tagName">The name of the tag.</param>
public MultiLevelHtmlTag(string tagName) : base(tagName)
{
}

/// <summary>
/// Gets the inner tag list.
/// </summary>
/// <value>The inner tag list.</value>
public IEnumerable<MultiLevelHtmlTag> InnerTags
{
get
{
return new ReadOnlyCollection<MultiLevelHtmlTag>(this.innerTags);
}
}

/// <summary>
/// Adds the specified tag to the inner tag list.
/// </summary>
/// <param name="tag">The tag to add.</param>
public void Add(MultiLevelHtmlTag tag)
{
if (tag == null)
{
throw new ArgumentNullException("tag");
}

this.innerTags.Add(tag);
}

/// <summary>
/// Returns a <see cref="System.String"/> that represents this instance.
/// </summary>
/// <returns>
/// A <see cref="System.String"/> that represents this instance.
/// </returns>
public override string ToString()
{
var sb = new StringBuilder();

foreach (var tag in this.innerTags)
{
sb.Append(tag.ToString());
}

this.InnerHtml = sb.ToString();
return base.ToString();
}
}

6
ответ дан 22 октября 2011 в 03:10 Источник Поделиться