예제 #1
0
        //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()));
        }
예제 #2
0
 public FluentTagBuilder(string tagName, TagRenderMode renderMode = TagRenderMode.Normal, FluentTagBuilder parent = null)
 {
     tagBuilder = new TagBuilder(tagName);
     tagBuilder.TagRenderMode = renderMode;
     this.parent   = parent;
     stringBuilder = new StringBuilder();
 }
예제 #3
0
        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()));
        }
예제 #4
0
        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()));
        }
예제 #5
0
        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
        }