Пример #1
0
        private string GetIconAnchor(string cssClass, string iconCssClass, int pageNumber, string title)
        {
            StringBuilder anchor = new StringBuilder();

            TagBuilder.Begin(anchor, "a");

            TagBuilder.AddClass(anchor, cssClass);

            if (!string.IsNullOrWhiteSpace(title))
            {
                TagBuilder.AddTitle(anchor, title);
            }

            if (pageNumber > 0)
            {
                TagBuilder.AddAttribute(anchor, "href",
                                        string.Format(CultureInfo.InvariantCulture, "{0}?page={1}", this._currentPageUrl, pageNumber));
            }

            TagBuilder.Close(anchor);

            if (!string.IsNullOrWhiteSpace(iconCssClass))
            {
                TagBuilder.AddIcon(anchor, iconCssClass);
            }

            TagBuilder.EndTag(anchor, "a");

            return(anchor.ToString());
        }
Пример #2
0
        public override string Get()
        {
            StringBuilder grid = new StringBuilder();

            using (DataTable table = this.GetTable())
            {
                if (table.Rows.Count.Equals(0))
                {
                    return("<div class='ui message'>No record found</div>");
                }

                TagBuilder.Begin(grid, "table");
                TagBuilder.AddId(grid, "FormGridView");
                TagBuilder.AddClass(grid, ConfigBuilder.GetGridViewCssClass(this.Config));
                TagBuilder.AddStyle(grid, ConfigBuilder.GetGridViewWidth(this.Config) + ";white-space: nowrap;");
                TagBuilder.Close(grid);

                List <Column> columns = GetColumns(table).ToList();

                HeaderRow header = new HeaderRow(this.Config, columns);
                grid.Append(header.Get());

                using (Body body = new Body(this.Config, table, columns))
                {
                    grid.Append(body.Get());
                }


                TagBuilder.EndTag(grid, "table");
            }


            return(grid.ToString());
        }
Пример #3
0
        internal static void AddScrudFormRow(StringBuilder builder, string targetControlId, string label, string control)
        {
            TagBuilder.Begin(builder, "tr", true);
            TagBuilder.Begin(builder, "td");
            TagBuilder.AddClass(builder, "label-cell");
            TagBuilder.Close(builder);

            TagBuilder.Begin(builder, "label");
            TagBuilder.AddAttribute(builder, "for", targetControlId);
            TagBuilder.Close(builder);

            builder.Append(label);

            TagBuilder.EndTag(builder, "label");

            TagBuilder.EndTag(builder, "td");

            TagBuilder.Begin(builder, "td");
            TagBuilder.AddClass(builder, "control-cell");
            TagBuilder.Close(builder);

            builder.Append(control);

            TagBuilder.EndTag(builder, "td");
            TagBuilder.EndTag(builder, "tr");
        }
Пример #4
0
        public static TagBuilder GridEditDeleteLink(this IHtmlHelper html, string controller, string editAction, string deleteAction, Dictionary <string, object> data, string objectTypeName, string objectName, bool editInGrid = false, string deleteController = null, bool renderDeleteLink = true)
        {
            object     htmlAttr = null;
            TagBuilder div      = new TagBuilder(Constants.DOM.DIV);

            div.AddClass("actIconsContainer");

            if (editInGrid)
            {
                foreach (var key in data.Keys)
                {
                    div.Attributes["data-" + key] = data[key].ToString();
                }
            }
            if (editAction.ToLower().Contains("edit"))
            {
                htmlAttr = new { title = "edit" };
            }
            div.InnerHtml.Append(html.GriEditLink(controller, editAction, data, objectTypeName, htmlAttr: htmlAttr).ToString());

            if (renderDeleteLink)
            {
                if (deleteAction.ToLower().Contains("delete"))
                {
                    htmlAttr = new { title = "delete" };
                }
                div.InnerHtml.Append(html.GridDeleteLink(deleteController.Nz(controller), deleteAction, data, objectTypeName, objectName, htmlAttr).ToString());
            }
            return(div);
        }
Пример #5
0
        public static IHtmlContent TickBox(this IHtmlHelper htmlHelper, string name, object value, bool isChecked, string extraClasses = null, string extraAttr = null)
        {
            TagBuilder tb = new TagBuilder(Constants.DOM.LABEL);

            tb.AddClass("checkbox-inline i-checks " + extraClasses);
            tb.InnerHtml.Append(addValidationErrorMarker(htmlHelper, new HtmlString(@"<input type = 'checkbox' value='{0}' name='{1}' id='{1}' {2} {3}/>".Frmt(value, name, isChecked ? "checked='checked'" : null, extraAttr)), name).ToString());

            return(tb);
        }
Пример #6
0
        public static IHtmlContent TickBoxFor <TModel>(this IHtmlHelper <TModel> htmlHelper, Expression <Func <TModel, bool> > expression, object attributes = null, string extraClasses = null)
        {
            var tb = new TagBuilder(Constants.DOM.LABEL);

            tb.AddClass("checkbox-inline i-checks " + extraClasses);
            tb.InnerHtml.Append(addValidationErrorMarker(htmlHelper, htmlHelper.CheckBoxFor(expression, attributes), htmlHelper.IdFor(expression)).ToString());

            return(tb);
        }
Пример #7
0
        public static IHtmlContent TimePicker <TModel, TResult>(this IHtmlHelper <TModel> helper, Expression <Func <TModel, TResult> > expression, bool isRequired = false)
        {
            TagBuilder divContainer = new TagBuilder(Constants.DOM.DIV);

            divContainer.AddClass("input-group bootstrap-timepicker");
            divContainer.InnerHtml.AppendHtml("<span class='input-group-addon'><i class='fa fa-clock-o'></i></span>");
            divContainer.InnerHtml.Append(BBTextBoxFor(helper, expression, new { required = isRequired, @class = "bs-timepicker form-control" }, "{0:t}").ToString());

            return(divContainer);
        }
Пример #8
0
        public static IHtmlContent DatePicker <TModel, TResult>(this IHtmlHelper <TModel> helper, Expression <Func <TModel, TResult> > expression, string extraClass = "", bool isRequired = false)
        {
            TagBuilder divContainer = new TagBuilder(Constants.DOM.DIV);

            divContainer.AddClass("input-group date");
            divContainer.InnerHtml.AppendHtml("<span class='input-group-addon'><i class='fa fa-calendar'></i></span>");
            divContainer.InnerHtml.Append(BBTextBoxFor(helper, expression, new { required = isRequired, @class = "form-control " + extraClass }, "{0:dd/MM/yyyy}").ToString());

            return(divContainer);
        }
Пример #9
0
        public static TagBuilder FALink(this IHtmlHelper html, string controller, string action, string iconClass, object routeValues = null, object htmlAttributes = null)
        {
            TagBuilder a = (TagBuilder)html.ActionLink(string.Empty, action, controller, routeValues, htmlAttributes);
            TagBuilder i = new TagBuilder(Constants.DOM.I);

            i.AddCssClass(Constants.Css.FONT_AWESOME);
            i.AddClass(iconClass);
            a.InnerHtml.Append(i.ToString());
            return(a);
        }
Пример #10
0
        public static IHtmlContent Save(this IHtmlHelper html, string name = "submit", string value = "save", string innerText = "Save", string additionalClasses = null)
        {
            TagBuilder tg = new TagBuilder(Constants.DOM.SPAN);

            tg.AddClass("redirectContainer");
            tg.InnerHtml.Append(html.Hidden(Constants.Route.PARENT_PAGE_URL, GetRefUrl(html)).ToString());
            tg.InnerHtml.Append(html.SubmitButton(
                                    name, value, innerText, additionalClasses,
                                    btn => btn.AddCssClass("btn-primary save-btn")
                                    ).ToString());

            return(tg);
        }
Пример #11
0
        private static IHtmlContent addValidationErrorMarker(this IHtmlHelper htmlHelper, IHtmlContent html, string elName)
        {
            var containerTag = new TagBuilder(Constants.DOM.DIV);

            containerTag.AddClass("validContainer");
            containerTag.InnerHtml.Append(html.ToString());

            var validationKeys = new string[] { "number", "required", "min", "max" };

            //if (Constants.HtmlAttribute.VALIDATION_ATTRS.Any(a => html.ToString().Contains(a)))
            {
                containerTag.InnerHtml.Append(ValidationErrorMarker(htmlHelper, elName).ToString());
            }
            return(containerTag);
        }
Пример #12
0
        public static IHtmlContent HiddenEnumerableFor <TModel, TResult>(this IHtmlHelper <TModel> htmlHelper, Expression <Func <TModel, TResult> > expression, object[] values, object attributes = null)
        {
            string     name         = htmlHelper.IdFor(expression);
            TagBuilder divContainer = new TagBuilder(Constants.DOM.DIV);

            divContainer.AddClass("{0}Container".Frmt(name));
            if (values != null)
            {
                foreach (var value in values)
                {
                    divContainer.InnerHtml.Append(htmlHelper.Hidden(name, value, attributes).ToString());
                }
            }
            return(divContainer);
        }
Пример #13
0
        //public static IHtmlContent DropZone(this IHtmlHelper html, IModelWithImage model, string dropZoneId)
        //{
        //	return html.Partial("_EditImages", new EditImages()
        //	{
        //		DropZoneId = dropZoneId,
        //		ImagesModel = model
        //	});
        //}

        public static IHtmlContent SubmitButton(this IHtmlHelper html, string name, string value, string innerText, string additionalClasses = null, Action <TagBuilder> setProperties = null)
        {
            TagBuilder result = new TagBuilder("button");

            result.Attributes[Constants.HtmlAttribute.NAME]  = name;
            result.Attributes[Constants.HtmlAttribute.VALUE] = value;
            result.Attributes[Constants.HtmlAttribute.TYPE]  = "submit";
            result.AddCssClass("btn");
            result.AddClass(additionalClasses);
            if (setProperties != null)
            {
                setProperties(result);
            }
            result.InnerHtml.SetHtmlContent(innerText);

            return(result);
        }
Пример #14
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="context"></param>
        /// <param name="output"></param>
        public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            switch (TagHelper.DropdownButtonType)
            {
            case DropdownButtonType.Single:
                output.AddClass("dropdown-toggle");
                output.AddAttribute("data-toggle", "dropdown");
                break;

            default:
                var tagbuilder = new TagBuilder(output.TagName);
                tagbuilder.MergeAttributes(output.Attributes.ToDictionary(a => a.Name, a => a.Value));
                tagbuilder.AddClass("dropdown-toggle").AddClass("dropdown-toggle-split").AddAttribute("data-toggle", "dropdown");
                output.PostElement.AppendHtml(tagbuilder);
                break;
            }
        }
Пример #15
0
        public override string Get()
        {
            StringBuilder form = new StringBuilder();

            TagBuilder.Begin(form, "form");
            TagBuilder.AddId(form, "FormPanel");
            TagBuilder.AddStyle(form, "display:none;");
            TagBuilder.AddClass(form, ConfigBuilder.GetFormPanelCssClass(this.Config));
            TagBuilder.Close(form);

            TagBuilder.Begin(form, "div");
            TagBuilder.AddClass(form, ConfigBuilder.GetFormCssClass(this.Config));
            TagBuilder.Close(form);

            TagBuilder.Begin(form, "div");
            TagBuilder.AddClass(form, ConfigBuilder.GetFormDescriptionCssClass(this.Config));
            TagBuilder.Close(form);

            form.Append(Resources.Titles.RequiredFieldDetails);

            TagBuilder.EndTag(form, "div");


            TagBuilder.Begin(form, "table");
            TagBuilder.AddAttribute(form, "role", "scrud");
            TagBuilder.Close(form);

            IEnumerable <FieldConfig> fields = FieldConfigHelper.GetFields(this.Values, this.Config, this.Editing);

            foreach (Field field in fields.Select(fieldConfig => new Field(this.Config, fieldConfig)))
            {
                form.Append(field.Get());
            }


            FormFooter footer = new FormFooter(this.Config);

            form.Append(footer.Get());

            TagBuilder.EndTag(form, "table");
            TagBuilder.EndTag(form, "div");
            TagBuilder.EndTag(form, "form");

            return(form.ToString());
        }
Пример #16
0
        private void BuildButton(StringBuilder builder, string type, string id, string click, string value)
        {
            TagBuilder.Begin(builder, "input");
            TagBuilder.AddType(builder, type);
            TagBuilder.AddId(builder, id);

            if (!string.IsNullOrWhiteSpace(click))
            {
                TagBuilder.AddAttribute(builder, "onclick", click);
            }

            if (!string.IsNullOrWhiteSpace(this.ButtonCssClass))
            {
                TagBuilder.AddClass(builder, this.ButtonCssClass);
            }

            TagBuilder.AddValue(builder, value);
            TagBuilder.Close(builder, true);
        }
Пример #17
0
        public override string Get()
        {
            StringBuilder list = new StringBuilder();

            TagBuilder.Begin(list, "div");
            TagBuilder.AddId(list, this.FieldConfig.ColumnName);
            TagBuilder.AddClass(list, "grouped inline fields");
            TagBuilder.AddAttribute(list, "data-scrud", "radio");
            TagBuilder.Close(list);

            TagBuilder.AddRadioField(list, this.FieldConfig.ColumnName, "yes", Resources.Titles.Yes,
                                     this.FieldConfig.DefaultValue.ToUpperInvariant().Equals("TRUE"), this.FieldConfig.IsDisabled);
            TagBuilder.AddRadioField(list, this.FieldConfig.ColumnName, "no", Resources.Titles.No,
                                     this.FieldConfig.DefaultValue.ToUpperInvariant().Equals("FALSE"), this.FieldConfig.IsDisabled);


            TagBuilder.EndTag(list, "div");

            return(list.ToString());
        }
Пример #18
0
        private string GetCommandPanel()
        {
            StringBuilder panel = new StringBuilder();

            TagBuilder.Begin(panel, "div");
            TagBuilder.AddClass(panel, ConfigBuilder.GetCommandPanelCssClass(this.Config));
            TagBuilder.Close(panel);

            this.AddSelectButton(panel);
            this.AddShowCompactButton(panel);
            this.AddShowAllButton(panel);
            this.AddAddButton(panel);
            this.AddEditButton(panel);
            this.AddDeleteButton(panel);
            this.AddPrintButton(panel);

            TagBuilder.EndTag(panel, "div");

            return(panel.ToString());
        }
Пример #19
0
        public static IHtmlContent DatePicker <TModel>(this IHtmlHelper <TModel> htmlHelper, string id, string value = "", string extraClass = "", string extraAttr = "")
        {
            var tg = new TagBuilder(Constants.DOM.DIV);

            tg.AddClass("input-group date");
            tg.Attributes.Add("id", id + "_dateContainer");
            var disabledAttr = "disabled";

            if (extraAttr.IsNotEmpty() && extraAttr.Contains(disabledAttr))
            {
                tg.Attributes.Add(disabledAttr, disabledAttr);
            }

            tg.InnerHtml.AppendHtml(@"
				<span class='input-group-addon'>
					<i class='fa fa-calendar'></i>
				</span>"                );
            tg.InnerHtml.Append(addValidationErrorMarker(htmlHelper, new HtmlString("<input type = 'text' id='{0}' name='{0}' asp-for='{0}' value='{1}' class='form-control {2}' {3} />".Frmt(id, value, extraClass, extraAttr)), id).ToString());

            return(tg);
        }
Пример #20
0
        public override string Get()
        {
            GridView grid = new GridView(this.Config);

            StringBuilder gridPanel = new StringBuilder();

            TagBuilder.Begin(gridPanel, "div");
            TagBuilder.AddId(gridPanel, "GridPanel");
            TagBuilder.AddClass(gridPanel, ConfigBuilder.GetGridPanelCssClass(this.Config));
            TagBuilder.AddStyle(gridPanel, ConfigBuilder.GetGridPanelStyle(this.Config));
            TagBuilder.Close(gridPanel);

            gridPanel.Append(grid.Get());

            Pager pager = new Pager(this.Config);

            gridPanel.Append(pager.Get());

            TagBuilder.EndTag(gridPanel, "div");

            return(gridPanel.ToString());
        }
Пример #21
0
        private string GetAnchor(int pageNumber)
        {
            StringBuilder anchor = new StringBuilder();

            TagBuilder.Begin(anchor, "a");


            TagBuilder.AddClass(anchor, pageNumber.Equals(this._currentPage) ? "active item" : "item");

            TagBuilder.AddAttribute(anchor, "href",
                                    string.Format(CultureInfo.InvariantCulture, "{0}?page={1}", this._currentPageUrl, pageNumber));

            TagBuilder.AddTitle(anchor, string.Format(Thread.CurrentThread.CurrentCulture, Titles.PageN, pageNumber));

            TagBuilder.Close(anchor);

            anchor.Append(pageNumber.ToString(Thread.CurrentThread.CurrentCulture));

            TagBuilder.EndTag(anchor, "a");

            return(anchor.ToString());
        }
Пример #22
0
        public override string Get()
        {
            StringBuilder selector = new StringBuilder();

            TagBuilder.Begin(selector, "a");

            TagBuilder.AddClass(selector, this.CssClass);

            TagBuilder.AddAttribute(selector, "role", this.HtmlRole);
            TagBuilder.AddAttribute(selector, "tabindex", this.TabIndex);
            TagBuilder.AddAttribute(selector, "data-title", this.FieldConfig.ColumnNameLocalized);
            TagBuilder.AddAttribute(selector, "href", this.HRef);

            if (this.FieldConfig.IsDisabled)
            {
                TagBuilder.AddStyle(selector, "pointer-events:none;");
            }

            TagBuilder.Close(selector);
            TagBuilder.EndTag(selector, "a");

            return(selector.ToString());
        }
Пример #23
0
        private string GetPager()
        {
            if (this._pageSize.Equals(0))
            {
                this._pageSize = this._blockCount;
            }

            this._totalPages = (int)Decimal.Ceiling(Decimal.Divide(this._totalRecords, this._pageSize));

            int start = 1 +
                        (int)Decimal.Ceiling(Decimal.Divide(this._currentPage, this._blockCount) - 1) * this._blockCount;
            int end = start + this._blockCount - 1;

            if (end > this._totalPages)
            {
                end = this._totalPages;
            }

            StringBuilder pager = new StringBuilder();

            TagBuilder.Begin(pager, "div");
            TagBuilder.AddClass(pager, this._cssClass);
            TagBuilder.Close(pager);

            pager.Append(this.FirstItem());
            pager.Append(this.PreviousItem());
            pager.Append(this.GetAnchor(1));

            //The previous page block
            string title;

            if (start - this._blockCount > 0)
            {
                title = string.Format(Thread.CurrentThread.CurrentCulture, Titles.PageN, start - 1);

                pager.Append(this.GetIconAnchor("icon item", "arrow left icon", start - 1, title));
            }

            //Paged items
            for (int i = start; i <= end; i++)
            {
                //Do not create the first and last page
                //because we will create them explicitly
                //which will be followed/led
                //by next/previous page blocks
                if (i.Equals(1) || i.Equals(this._totalPages))
                {
                    continue;
                }

                pager.Append(this.GetAnchor(i));
            }


            //The next page block
            if (start + this._blockCount < this._totalPages)
            {
                title = string.Format(Thread.CurrentThread.CurrentCulture, Titles.PageN, end + 1);
                pager.Append(this.GetIconAnchor("icon item", "arrow right icon", end + 1, title));
            }

            pager.Append(this.GetAnchor(this._totalPages));
            pager.Append(this.NextItem());
            pager.Append(this.LastItem());

            TagBuilder.EndTag(pager, "div");
            return(pager.ToString());
        }
Пример #24
0
        public override string Get()
        {
            StringBuilder rows = new StringBuilder();

            TagBuilder.Begin(rows, "tbody", true);

            for (int i = 0; i < this.Table.Rows.Count; i++)
            {
                DataRow row      = this.Table.Rows[i];
                string  keyValue = row[this.Config.KeyColumn].ToString();

                TagBuilder.Begin(rows, "tr", true);

                TagBuilder.Begin(rows, "td", true);

                TagBuilder.Begin(rows, "input");
                TagBuilder.AddType(rows, "radio");
                TagBuilder.AddId(rows, "SelectRadio" + keyValue);
                TagBuilder.AddValue(rows, keyValue);

                TagBuilder.Close(rows, true);

                TagBuilder.EndTag(rows, "td");


                foreach (Column column in this.Columns)
                {
                    TagBuilder.Begin(rows, "td");

                    switch (column.Type.FullName)
                    {
                    case "System.Decimal":
                    case "System.Double":
                    case "System.Single":
                        TagBuilder.AddClass(rows, "text right");
                        TagBuilder.Close(rows);

                        decimal value = Conversion.TryCastDecimal(row[column.ColumnName]);

                        if (!value.Equals(0))
                        {
                            rows.Append(value.ToString("N", CultureInfo.CurrentCulture));
                        }

                        break;

                    case "System.DateTime":
                        TagBuilder.AddClass(rows, "text right");
                        TagBuilder.Close(rows);

                        DateTime date = Conversion.TryCastDate(row[column.ColumnName]);

                        rows.Append(date.Date == date
                                ? Conversion.TryCastDate(date).ToString("D", CultureInfo.CurrentCulture)
                                : Conversion.TryCastDate(date).ToString("F", CultureInfo.CurrentCulture));

                        break;

                    default:
                        TagBuilder.Close(rows);
                        rows.Append(HttpUtility.HtmlEncode(row[column.ColumnName]));
                        break;
                    }

                    TagBuilder.EndTag(rows, "td");
                }

                TagBuilder.EndTag(rows, "tr");
            }

            TagBuilder.EndTag(rows, "tbody");

            return(rows.ToString());
        }
Пример #25
0
        public override string Get()
        {
            if (string.IsNullOrWhiteSpace(this.FieldConfig.ColumnName))
            {
                return(string.Empty);
            }

            StringBuilder textBox = new StringBuilder();
            string        type    = "text";


            bool isPasswordField = this.FieldConfig.ColumnName.ToUpperInvariant().Equals("PASSWORD");

            TagBuilder.Begin(textBox, "input");
            TagBuilder.AddId(textBox, this.FieldConfig.ColumnName);
            TagBuilder.AddAttribute(textBox, "data-scrud", "text");

            if (isPasswordField && this.FieldConfig.IsDisabled)
            {
                type = "password";
                this.FieldConfig.DefaultValue = "fake-password";
            }

            if (this.FieldConfig.IsDisabled)
            {
                textBox.Append(" readonly='readonly'");
            }

            if (!string.IsNullOrWhiteSpace(this.ValidationType))
            {
                TagBuilder.AddAttribute(textBox, "data-vtype", this.ValidationType);
            }


            TagBuilder.AddType(textBox, type);

            if (this.FieldConfig.DataType.ToUpperInvariant().Equals("COLOR"))
            {
                TagBuilder.AddClass(textBox, "color");
            }

            if (!this.FieldConfig.DefaultValue.StartsWith("nextVal", StringComparison.OrdinalIgnoreCase))
            {
                if (this.ValidationType == "date")
                {
                    DateTime date = Conversion.TryCastDate(this.FieldConfig.DefaultValue);

                    if (date != DateTime.MinValue)
                    {
                        TagBuilder.AddValue(textBox, date.Date == date ? date.ToString("d") : date.ToString("f"));
                    }

                    TagBuilder.AddClass(textBox, "date");
                }
                else
                {
                    TagBuilder.AddValue(textBox, this.FieldConfig.DefaultValue);
                }
            }


            if (!this.FieldConfig.IsNullable)
            {
                TagBuilder.AddRequired(textBox);
            }

            if (this.FieldConfig.MaxLength > 0)
            {
                TagBuilder.AddAttribute(textBox, "maxlength", this.FieldConfig.MaxLength);
            }

            TagBuilder.Close(textBox, true);

            return(textBox.ToString());
        }
Пример #26
0
        public static IHtmlContent Grid <T>(this IHtmlHelper htmlHelper, string actionUrl, GridModel <T> model)
        {
            TagBuilder formTag = new TagBuilder(Constants.DOM.FORM);

            formTag.MergeAttributes(new
            {
                method = "POST",
                action = actionUrl
            });
            TagBuilder tableTag = new TagBuilder(Constants.DOM.TABLE);

            tableTag.AddCssClass("table table-striped");
            tableTag.AddClass(model.Class);
            TagBuilder tHead     = new TagBuilder("thead");
            TagBuilder headerRow = new TagBuilder(Constants.DOM.TR);

            foreach (GridModelColumn <T> col in model.Columns)
            {
                TagBuilder cell = new TagBuilder(Constants.DOM.TH);
                cell.AddClass(col.Class);
                cell.InnerHtml.SetContent(col.HeaderTextFunc().ToString());
                headerRow.InnerHtml.Append(cell.ToString());
            }
            tHead.InnerHtml.SetContent(headerRow.ToString());
            tableTag.InnerHtml.Append(tHead.ToString());

            TagBuilder tBody = new TagBuilder("tbody");

            foreach (T item in model.Data)
            {
                TagBuilder row = new TagBuilder(Constants.DOM.TR);
                foreach (GridModelColumn <T> col in model.Columns)
                {
                    TagBuilder cell = new TagBuilder(Constants.DOM.TD);
                    cell.Attributes["data-name"] = col.Name;
                    if (col.ValueFunc != null)
                    {
                        cell.Attributes["data-value"] = col.ValueFunc(item);
                    }
                    cell.InnerHtml.SetContent(col.ItemTemplateFunc(item).ToString());
                    row.InnerHtml.Append(cell.ToString());
                }
                tBody.InnerHtml.Append(row.ToString());
            }
            tableTag.InnerHtml.Append(tBody.ToString());
            formTag.InnerHtml.SetContent(tableTag.ToString());

            TagBuilder scriptTag = new TagBuilder(Constants.DOM.SCRIPT);

            scriptTag.Attributes.Add("type", "text/x-handlebars-template");
            TagBuilder editRow = new TagBuilder(Constants.DOM.TR);

            editRow.AddCssClass("edit-row");
            foreach (GridModelColumn <T> col in model.Columns)
            {
                TagBuilder cell = new TagBuilder(Constants.DOM.TD);
                cell.InnerHtml.SetContent(col.EditorTemplateFunc("{{" + col.Name + "}}").ToString());
                editRow.InnerHtml.Append(cell.ToString());
            }
            scriptTag.InnerHtml.SetContent(editRow.ToString());

            TagBuilder gridDiv = new TagBuilder(Constants.DOM.DIV);

            gridDiv.AddCssClass("grid-view table-responsive");
            gridDiv.InnerHtml.Append(formTag.ToString());
            gridDiv.InnerHtml.Append(scriptTag.ToString());
            return(gridDiv);
        }