private void DisplayTags(int? ownerId, int entityId) { // get tags var tags = new TagService() .Queryable() .Where(t => t.EntityTypeId == entityId && t.OwnerId == ownerId) .Select(t => new { Id = t.Id, Name = t.Name, Count = t.TaggedItems.Count() }) .OrderBy(t => t.Name); // create dictionary to group by first letter of name Dictionary<char, List<TagSummary>> tagAlphabit = new Dictionary<char, List<TagSummary>>(); // load alphabit into dictionary for (char c = 'A'; c <= 'Z'; c++) { tagAlphabit.Add(c, new List<TagSummary>()); } // load tags foreach (var tag in tags) { var tagSummary = new TagSummary { Id = tag.Id, Name = tag.Name, Count = tag.Count }; tagAlphabit[(char)tag.Name.Substring(0, 1).ToUpper()[0]].Add(tagSummary); } // display tags StringBuilder tagOutput = new StringBuilder(); StringBuilder letterOutput = new StringBuilder(); letterOutput.Append("<ul class='list-inline tag-letterlist'>"); tagOutput.Append("<ul class='list-unstyled taglist'>"); foreach (var letterItem in tagAlphabit) { if (letterItem.Value.Count > 0) { letterOutput.Append(String.Format("<li><a href='#{0}'>{0}</a></li>", letterItem.Key.ToString())); // add tags to display tagOutput.Append(String.Format("<li class='clearfix'><h3><a name='{0}'></a>{1}</h3><ul class='list-inline'>", letterItem.Key.ToString(), letterItem.Key.ToString())); foreach (TagSummary tag in letterItem.Value) { Dictionary<string, string> queryString = new Dictionary<string, string>(); queryString.Add("tagId", tag.Id.ToString()); var detailPageUrl = LinkedPageUrl("DetailPage", queryString); tagOutput.Append(string.Format("<a href='{0}'><span class='tag'>{1} <small>({2})</small></span></a>", detailPageUrl, tag.Name, tag.Count)); } tagOutput.Append("</ul></li>"); } else { letterOutput.Append(String.Format("<li>{0}</li>", letterItem.Key.ToString())); } } tagOutput.Append("</ul>"); letterOutput.Append("</ul>"); // if no tags add message instead if (tags.Count() == 0) { tagOutput.Clear(); tagOutput.Append("<div class='alert alert-info'><h4>Note</h4>No personal tags exist.</div>"); } lTagList.Text = tagOutput.ToString(); lLetters.Text = letterOutput.ToString(); }