Написал для сайта простой и удобный, на мой взгляд :), класс наследник от WebControl'а для формирования модного на данный момент элемента любого блога - облака тэгов (tag clouds).
Исходный код контрола:
namespace ProgBlog.Controls
{
public class TagCloudsControl : WebControl
{
public override void RenderBeginTag(HtmlTextWriter writer)
{
}
public override void RenderEndTag(HtmlTextWriter writer)
{
}
public List<TagCloudsEntry> Entrys { get; set; }
public TagCloudsControl()
{
Entrys = new List<TagCloudsEntry>();
}
private Unit m_maxHeight = new Unit(1.5, UnitType.Em);
private Unit m_minHeight = new Unit(0.8, UnitType.Em);
private string m_tagDelimeter = " ";
public string TagDelimiter { get { return m_tagDelimeter; } set { m_tagDelimeter = value; } }
public Unit MaxHeight { get { return m_maxHeight; } set { m_maxHeight = value; } }
public Unit MinHeight { get { return m_minHeight; } set { m_minHeight = value; } }
protected override void RenderContents(HtmlTextWriter writer)
{
if (Entrys == null || Entrys.Count() == 0)
return;
int maxCount = Entrys.Max(i => i.Count);
int minCount = Entrys.Min(i => i.Count);
for (int i = 0; i < Entrys.Count; i++)
{
var entry = Entrys[i];
double percInCount = ((entry.Count - minCount) / (double)(maxCount - minCount));
Entrys[i].Link.Font.Size = new FontUnit(
(m_maxHeight.Value - m_minHeight.Value) * percInCount + m_minHeight.Value, UnitType.Em);
Entrys[i].Link.RenderControl(writer);
writer.Write(m_tagDelimeter);
}
}
}
public class TagCloudsEntry
{
public HyperLink Link { get; private set; }
public int Count { get; private set; }
public TagCloudsEntry(HyperLink link, int count)
{
if ((Link = link) == null)
throw new ArgumentNullException("link");
if ((Count = count) < 0)
throw new ArgumentOutOfRangeException("count");
}
}
}
Методы RenderBeginTag и RenderEndTag переопределены чтобы контрол не рендерил ненужный в данном случае тэг.
Использование:
1. Регистрируем контрол на странице
<%@ register namespace="ProgBlog.Controls" tagprefix="progblog" assembly="ProgBlog" %>
2.Вставляем контрол
<progblog:TagCloudsControl ID="tagsCloud" runat="server" />
3. Заполняем тэгами
using (ProgBlogDataContext dc = new ProgBlogDataContext())
{
Dictionary<Tag, int> postTags = new Dictionary<Tag, int>();
//заполняем Dictionary и проставляем Count - количество повторений тэга
foreach(var tag in dc.PostTags)
{
int count;
if (!postTags.TryGetValue(tag.Tag, out count))
postTags.Add(tag.Tag, 1);
else
postTags[tag.Tag]++;
}
//заполняем тэги контрола
foreach (var tag in postTags)
{
HyperLink hl = new HyperLink();
hl.Text = tag.Key.TagName;
hl.NavigateUrl = "~/Default.aspx?TagId="+tag.Key.TagId;
tagsCloud.Entrys.Add(new ProgBlog.Controls.TagCloudsEntry(hl, tag.Value));
}
}
4. Радуемся :)
Скачать контрол