//TODO: Test public static IHtmlContent Table <T>(this IHtmlHelper html, IEnumerable <T> items, object htmlAttributes = null) { var builder = new FluentTagBuilder("table") .MergeAttributes(htmlAttributes) .StartTag("thead") .StartTag("tr"); var properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (var property in properties) { builder = builder.StartTag("th").SetInnerHtml(property.Name).EndTag(); } builder .EndTag() // </tr> .EndTag() // </thead> .StartTag("tbody"); foreach (var item in items) { builder = builder.StartTag("tr"); foreach (var property in properties) { string value = property.GetValue(item).ToString(); builder = builder.StartTag("td").SetInnerHtml(value).EndTag(); } builder = builder.EndTag(); // </tr> } builder = builder.EndTag(); // </tbody> return(new HtmlString(builder.ToString())); }
public FluentTagBuilder(string tagName, TagRenderMode renderMode = TagRenderMode.Normal, FluentTagBuilder parent = null) { tagBuilder = new TagBuilder(tagName); tagBuilder.TagRenderMode = renderMode; this.parent = parent; stringBuilder = new StringBuilder(); }
public static IHtmlContent CheckBoxListFor <TModel, TProperty>( this IHtmlHelper <TModel> html, Expression <Func <TModel, IEnumerable <TProperty> > > expression, IEnumerable <SelectListItem> selectList, byte numberOfColumns = 1, object labelHtmlAttributes = null, object checkboxHtmlAttributes = null) where TModel : class { string htmlFieldName = ExpressionHelper.GetExpressionText(expression); string fullHtmlFieldName = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(htmlFieldName); string fullHtmlFieldId = html.ViewData.TemplateInfo.GetFullHtmlFieldId(htmlFieldName); var func = expression.Compile(); var selectedValues = func(html.ViewData.Model); var values = new List <string>(); if (selectedValues != null) { values.AddRange(selectedValues.Select(x => Convert.ToString(x))); } if (selectList == null) { throw new ArgumentNullException(nameof(selectList)); } int index = 0; var sb = new StringBuilder(); bool groupByCategory = (selectList.First() is ExtendedSelectListItem); if (groupByCategory) { var items = selectList.Cast <ExtendedSelectListItem>().ToList(); var groups = items.GroupBy(x => x.Category); foreach (var @group in groups) { sb.AppendFormat("<strong>{0}</strong>", group.Key); foreach (var item in group) { var isChecked = values.Contains(item.Value); var tagBuilder = new FluentTagBuilder("label") .MergeAttribute("for", fullHtmlFieldName) .MergeAttributes(labelHtmlAttributes) .StartTag("input", TagRenderMode.SelfClosing) .MergeAttribute("type", "checkbox") .MergeAttribute("name", fullHtmlFieldName) .MergeAttribute("id", fullHtmlFieldId + "_" + index) .MergeAttribute("value", item.Value); if (isChecked) { tagBuilder = tagBuilder.MergeAttribute("checked", "checked"); } if (checkboxHtmlAttributes != null) { tagBuilder = tagBuilder.MergeAttributes(checkboxHtmlAttributes); } tagBuilder = tagBuilder.EndTag(); //end checkbox tagBuilder = tagBuilder .StartTag("span") .SetInnerHtml(item.Text) .EndTag(); sb.Append(tagBuilder.ToString()); index++; } } } else { var rows = (int)Math.Ceiling((selectList.Count() * 1d) / numberOfColumns); var columnWidth = (int)Math.Ceiling(12d / numberOfColumns); for (var i = 0; i < numberOfColumns; i++) { var items = selectList.Skip(i * rows).Take(rows); sb.AppendFormat("<div class=\"col-md-{0}\">", columnWidth); foreach (var item in items) { var isChecked = values.Contains(item.Value); var tagBuilder = new FluentTagBuilder("label") .MergeAttribute("for", fullHtmlFieldName) .MergeAttributes(labelHtmlAttributes) .StartTag("input", TagRenderMode.SelfClosing) .MergeAttribute("type", "checkbox") .MergeAttribute("name", fullHtmlFieldName) .MergeAttribute("id", fullHtmlFieldId + "_" + index) .MergeAttribute("value", item.Value); if (isChecked) { tagBuilder = tagBuilder.MergeAttribute("checked", "checked"); } if (checkboxHtmlAttributes != null) { tagBuilder = tagBuilder.MergeAttributes(checkboxHtmlAttributes); } tagBuilder = tagBuilder.EndTag(); //end checkbox tagBuilder = tagBuilder .StartTag("span") .SetInnerHtml(item.Text) .EndTag(); sb.Append(tagBuilder.ToString()); index++; } sb.Append("</div>"); } } return(new HtmlString(sb.ToString())); }
public static IHtmlContent CheckBoxList( this IHtmlHelper html, string name, IEnumerable <SelectListItem> selectList, IEnumerable <string> selectedValues, byte numberOfColumns = 1, object labelHtmlAttributes = null, object checkboxHtmlAttributes = null) { string fullHtmlFieldName = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name); string fullHtmlFieldId = html.ViewData.TemplateInfo.GetFullHtmlFieldId(name); var values = new List <string>(); if (selectedValues != null) { values.AddRange(selectedValues); } if (selectList.IsNullOrEmpty()) { return(HtmlString.Empty); } int index = 0; var sb = new StringBuilder(); bool groupByCategory = (selectList.First() is ExtendedSelectListItem); if (groupByCategory) { var items = selectList.Cast <ExtendedSelectListItem>().ToList(); var groups = items.GroupBy(x => x.Category); foreach (var @group in groups) { sb.AppendFormat(@"<label class=""checkbox-list-group-label"">{0}</label>", group.Key); foreach (var item in group) { var isChecked = values.Contains(item.Value); var tagBuilder = new FluentTagBuilder("label") .MergeAttribute("for", fullHtmlFieldName) .MergeAttributes(labelHtmlAttributes) .StartTag("input", TagRenderMode.SelfClosing) .MergeAttribute("type", "checkbox") .MergeAttribute("name", fullHtmlFieldName) .MergeAttribute("id", fullHtmlFieldId + "_" + index) .MergeAttribute("value", item.Value); if (isChecked) { tagBuilder = tagBuilder.MergeAttribute("checked", "checked"); } if (checkboxHtmlAttributes != null) { tagBuilder = tagBuilder.MergeAttributes(checkboxHtmlAttributes); } tagBuilder = tagBuilder.EndTag(); //end checkbox tagBuilder = tagBuilder .StartTag("span") .SetInnerHtml(item.Text) .EndTag(); sb.Append(tagBuilder.ToString()); index++; } } } else { var rows = (int)Math.Ceiling((selectList.Count() * 1d) / numberOfColumns); var columnWidth = (int)Math.Ceiling(12d / numberOfColumns); for (var i = 0; i < numberOfColumns; i++) { var items = selectList.Skip(i * rows).Take(rows); sb.AppendFormat("<div class=\"col-md-{0}\">", columnWidth); foreach (var item in items) { var isChecked = values.Contains(item.Value); var tagBuilder = new FluentTagBuilder("label") .MergeAttribute("for", fullHtmlFieldName) .MergeAttributes(labelHtmlAttributes) .StartTag("input", TagRenderMode.SelfClosing) .MergeAttribute("type", "checkbox") .MergeAttribute("name", fullHtmlFieldName) .MergeAttribute("id", fullHtmlFieldId + "_" + index) .MergeAttribute("value", item.Value); if (isChecked) { tagBuilder = tagBuilder.MergeAttribute("checked", "checked"); } if (checkboxHtmlAttributes != null) { tagBuilder = tagBuilder.MergeAttributes(checkboxHtmlAttributes); } tagBuilder = tagBuilder.EndTag(); //end checkbox tagBuilder = tagBuilder .StartTag("span") .SetInnerHtml(item.Text) .EndTag(); sb.Append(tagBuilder.ToString()); index++; } sb.Append("</div>"); } } return(new HtmlString(sb.ToString())); }
private static string CreateCheckBox( SelectListItem item, IEnumerable <string> values, string fullHtmlFieldId, string fullHtmlFieldName, int index, object labelHtmlAttributes, object checkboxHtmlAttributes, bool inputInsideLabel, bool wrapInDiv, object wrapperHtmlAttributes) { FluentTagBuilder tagBuilder = null; if (wrapInDiv) { tagBuilder = new FluentTagBuilder("div") .MergeAttributes(wrapperHtmlAttributes ?? new { @class = "extenso-checkbox" }) .StartTag("label"); } else { tagBuilder = new FluentTagBuilder("label"); } tagBuilder = tagBuilder .MergeAttribute("for", fullHtmlFieldName) .MergeAttributes(labelHtmlAttributes); if (!inputInsideLabel) { tagBuilder = tagBuilder.EndTag(); // end label } #region CheckBox Input tagBuilder = tagBuilder .StartTag("input", TagRenderMode.SelfClosing) .MergeAttribute("type", "checkbox") .MergeAttribute("name", fullHtmlFieldName) .MergeAttribute("id", $"{fullHtmlFieldId}_{index}") .MergeAttribute("value", item.Value); bool isChecked = values.Contains(item.Value); if (isChecked) { tagBuilder = tagBuilder.MergeAttribute("checked", "checked"); } if (checkboxHtmlAttributes != null) { tagBuilder = tagBuilder.MergeAttributes(checkboxHtmlAttributes); } tagBuilder = tagBuilder.EndTag(); //end checkbox #endregion CheckBox Input // CheckBox Texts tagBuilder = tagBuilder .StartTag("span") .SetInnerHtml(item.Text) .EndTag(); // end span if (inputInsideLabel) { tagBuilder = tagBuilder.EndTag(); // end label } return(tagBuilder.ToString()); // final div or label ended automatically }