public virtual MvcHtmlString Build(TModel model, BootstrapFormType formType, bool renderButtons = true) { var sb = new StringBuilder(2000); var formElements = ExtractElementsToRender(model); var groupsofElements = formElements.OrderBy(x => x.ControlSpecs.GroupName).GroupBy(x => x.ControlSpecs.GroupName); bool useLegend = (formElements.Select(x => x.ControlSpecs.GroupName).Distinct().Count() > 1); var stringWriter = new StringWriter(sb); using (var textWriter = new NavHtmlTextWritter(stringWriter)) { RenderHiddenFields(model, formElements, textWriter); foreach (var groupedElements in groupsofElements) { var groupName = (!String.IsNullOrEmpty(groupedElements.Key)) ? groupedElements.Key : "General"; using (new ElementGroup(textWriter, groupName, useLegend)) { var elementsToRender = groupedElements.Where(x => x.ControlSpecs.Control != ControlType.Hidden) .OrderBy(x => x.ControlSpecs.Order); // loop over the attributes (ordered).. foreach (var formElement in elementsToRender) { using (new ControlGroup(textWriter)) { ControlGroup.RenderLabel(formType, formElement, textWriter); using (new ControlContainer(textWriter)) { // Control RenderElement(textWriter, model, formElement); } } } } } if (renderButtons) { RenderButtons(textWriter); } return(new MvcHtmlString(sb.ToString())); } }