public ActionResult CreateFormGroup(FormGroupModel formGroupModel)
        {
            // Obtain your OAuth token
            string accessToken = RequestItemsService.User.AccessToken;                      // Represents your {ACCESS_TOKEN}
            var    basePath    = $"{RequestItemsService.Session.RoomsApiBasePath}/restapi"; // Base API path
            string accountId   = RequestItemsService.Session.AccountId;                     // Represents your {ACCOUNT_ID}

            try
            {
                // Call the Rooms API to create form group
                FormGroup formGroup = CreateFormGroups.CreateGroup(basePath, accessToken, accountId, formGroupModel.Name);

                ViewBag.h1          = "The form group was successfully created";
                ViewBag.message     = $"The form group was successfully created, FormGroupId: '{formGroup.FormGroupId}'";
                ViewBag.Locals.Json = JsonConvert.SerializeObject(formGroup, Formatting.Indented);

                return(View("example_done"));
            }
            catch (ApiException apiException)
            {
                ViewBag.errorCode    = apiException.ErrorCode;
                ViewBag.errorMessage = apiException.Message;

                return(View("Error"));
            }
        }
        public ActionResult CreateFormGroup(FormGroupModel formGroupModel)
        {
            string accessToken = RequestItemsService.User.AccessToken;                      // Represents your {ACCESS_TOKEN}
            var    basePath    = $"{RequestItemsService.Session.RoomsApiBasePath}/restapi"; // Base API path

            // Step 2 start
            var apiClient = new ApiClient(basePath);

            apiClient.Configuration.DefaultHeader.Add("Authorization", "Bearer " + accessToken);
            // Step 2 end

            var    formGroupsApi = new FormGroupsApi(apiClient);
            string accountId     = RequestItemsService.Session.AccountId;

            try
            {
                // Step 3 start
                var formGroupForCreate = new FormGroupForCreate(formGroupModel.Name);
                // Step 3 end

                // Step 4 start
                FormGroup formGroup = formGroupsApi.CreateFormGroup(accountId, formGroupForCreate);
                // Step 4 end

                ViewBag.h1          = "The form group was successfully created";
                ViewBag.message     = $"The form group was successfully created, FormGroupId: '{formGroup.FormGroupId}'";
                ViewBag.Locals.Json = JsonConvert.SerializeObject(formGroup, Formatting.Indented);

                return(View("example_done"));
            }
            catch (ApiException apiException)
            {
                ViewBag.errorCode    = apiException.ErrorCode;
                ViewBag.errorMessage = apiException.Message;

                return(View("Error"));
            }
        }
        private void BuilderForm()
        {
            var form = new TagBuilder("form");

            boday.InnerHtml.AppendHtml(form);

            form.AddCssClass("form-horizontal");
            form.Attributes.Add("id", "builder_form");
            int lableWidth = formColumn ? 2 : 2;
            int divWidth   = formColumn ? 4 : 10;

            int                   groupIndex = formColumn ? 2 : 1;
            int                   index      = 0;
            TagBuilder            group      = null;
            List <FormGroupModel> listGroup  = new List <FormGroupModel>();

            foreach (var prop in modelType.GetProperties())
            {
                var formIgnore = prop.GetCustomAttribute <FormIgnoreAttribute>();
                if (formIgnore != null)
                {
                    continue;
                }
                var displayAttribute = prop.GetCustomAttribute <DisplayAttribute>();
                if (displayAttribute == null || displayAttribute.GetAutoGenerateField() == false || prop.GetCustomAttribute <ModelKeyAttribute>() != null)
                {
                    continue;
                }
                var modelExplorer = viewModel.ModelExplorer.GetExplorerForProperty(prop.Name);
                var control       = new FormGroupModel()
                {
                    Sort        = displayAttribute.Order,
                    DisplayName = displayAttribute.Name?.Length < 1 ? prop.Name : displayAttribute.Name,
                    Name        = prop.Name
                };
                listGroup.Add(control);
                BuildInputType(prop, control, modelExplorer);

                if (control.Input != null)
                {
                    control.Input.Attributes.Add("ng-model", $"Model.Active.{prop.Name}");
                }
            }

            foreach (var item in listGroup.OrderBy(d => d.Sort))
            {
                if (index++ % groupIndex == 0 || group == null)
                {
                    group = new TagBuilder("div");
                    form.InnerHtml.AppendHtml(group);
                    group.AddCssClass("form-group");
                }
                var label = new TagBuilder("label");
                label.AddCssClass($"col-sm-{lableWidth} control-label");
                label.Attributes.Add("for", item.Name);
                label.InnerHtml.AppendHtml(item.DisplayName);
                group.InnerHtml.AppendHtml(label);

                var divInput = new TagBuilder("div");
                group.InnerHtml.AppendHtml(divInput);

                divInput.AddCssClass($"col-sm-{divWidth}");
                if (item.Input != null)
                {
                    divInput.InnerHtml.AppendHtml(item.Input);
                }

                if (item.TextDanger != null)
                {
                    divInput.InnerHtml.AppendHtml(item.TextDanger);
                }
            }


            var modelKey = modelType.GetProperties().Where(d => d.GetCustomAttribute <ModelKeyAttribute>() != null).FirstOrDefault();

            if (modelKey != null)
            {
                form.InnerHtml.AppendHtml($"<input type='text' id='{modelKey.Name}' name='{modelKey.Name}' value='{modelKey.GetValue(viewModel.Model, null)}' style='display:none' ng-model='Model.Active.{modelKey.Name}'>");
            }

            form.InnerHtml.AppendHtml("<div ng-show='Model.Edit.saveSuccess' class=\"alert alert-success\" role=\"alert\">操作成功!</div>");
            form.InnerHtml.AppendHtml("<div ng-show='Model.Edit.saveError' class=\"alert alert-danger\" role=\"alert\">{{Model.Edit.errorInfo}}</div>");
        }
        void BuildInputType(PropertyInfo prop, FormGroupModel group, ModelExplorer modelExplorer)
        {
            //判断是否有设置dataType
            var dataType = prop.GetCustomAttribute <DataTypeAttribute>();

            if (dataType?.DataType != null)
            {
                switch (dataType.DataType)
                {
                case DataType.Text:
                    group.Input      = Generator.GenerateTextBox(viewContext, modelExplorer, prop.Name, null, null, new { @class = "form-control" });
                    group.TextDanger = Generator.GenerateValidationMessage(viewContext, modelExplorer, prop.Name, null, viewContext.ValidationMessageElement, new { @class = "text-danger" });
                    break;

                case DataType.Password:
                    group.Input      = Generator.GeneratePassword(viewContext, modelExplorer, prop.Name, null, new { @class = "form-control" });
                    group.TextDanger = Generator.GenerateValidationMessage(viewContext, modelExplorer, prop.Name, null, viewContext.ValidationMessageElement, new { @class = "text-danger" });
                    break;

                case DataType.PhoneNumber:
                    group.Input      = Generator.GenerateTextBox(viewContext, modelExplorer, prop.Name, null, null, new { @class = "form-control", @type = "tel" });
                    group.TextDanger = Generator.GenerateValidationMessage(viewContext, modelExplorer, prop.Name, null, viewContext.ValidationMessageElement, new { @class = "text-danger" });
                    break;

                case DataType.MultilineText:
                    group.Input      = Generator.GenerateTextArea(viewContext, modelExplorer, prop.Name, 2, 1, new { @class = "form-control" });
                    group.TextDanger = Generator.GenerateValidationMessage(viewContext, modelExplorer, prop.Name, null, viewContext.ValidationMessageElement, new { @class = "text-danger" });
                    break;

                case DataType.EmailAddress:
                    group.Input      = Generator.GenerateTextBox(viewContext, modelExplorer, prop.Name, null, null, new { @class = "form-control", @type = "email" });
                    group.TextDanger = Generator.GenerateValidationMessage(viewContext, modelExplorer, prop.Name, null, viewContext.ValidationMessageElement, new { @class = "text-danger" });
                    break;

                case DataType.Url:
                    group.Input      = Generator.GenerateTextBox(viewContext, modelExplorer, prop.Name, null, null, new { @class = "form-control", @type = "url" });
                    group.TextDanger = Generator.GenerateValidationMessage(viewContext, modelExplorer, prop.Name, null, viewContext.ValidationMessageElement, new { @class = "text-danger" });
                    break;

                default:
                    break;
                }
                return;
            }

            // 自定义selectControl控件
            var selectControl = prop.GetCustomAttribute <SelectControlAttribute>();

            if (selectControl != null)
            {
                if (selectControl.Type == ItemDataType.StaticItems)
                {
                    List <SelectListItem> nodes = new List <SelectListItem>();
                    var items = modelType.GetProperty(selectControl.ItemsName);
                    if (items != null)
                    {
                        nodes = items.GetValue(viewModel.Model, null) as List <SelectListItem>;
                    }
                    group.Input = Generator.GenerateSelect(viewContext, modelExplorer, null, prop.Name, nodes?.ToList(), false, new { @class = "form-control" });
                    var initValue = nodes.FirstOrDefault(d => d.Selected)?.Value;
                    var ngInit    = initValue?.Length > 0 ? initValue : nodes[0].Value;
                    group.Input.Attributes.Add("ng-init", $"Model.Active.{prop.Name}='{ngInit}'");
                }
                else
                {
                    string url = selectControl.Type == ItemDataType.AbsUrl ? selectControl.Url : $"http://{viewContext.HttpContext.Request.Host.Value}/{selectControl.Controller}/{selectControl.Action}";
                    group.Input = new TagBuilder("select-control");
                    group.Input.AddCssClass("form-control");
                    group.Input.Attributes.Add("id", prop.Name);
                    group.Input.Attributes.Add("name", prop.Name);
                    group.Input.Attributes.Add("request-url", url);
                    group.Input.Attributes.Add("request-init", $"Model.Active.{prop.Name}");
                }

                return;
            }
            //自定义 radiolist 控件
            //var radioListControl = prop.GetCustomAttribute<RadioListAttribute>();
            //if (radioListControl != null)
            //{
            //    var values = radioListControl.Values.Split(',');
            //    var tests = radioListControl.Texts.Split(',');

            //    if (values.Length == tests.Length)
            //    {
            //        group.Input = new TagBuilder("div");
            //        var index = 0;
            //        foreach (var item in values)
            //        {
            //            group.Input = new TagBuilder("label");
            //            group.Input.InnerHtml.AppendHtml($"<input type='radio' name='{prop.Name}' ng-model='Model.Active.{item}' class='form-control'/>{tests[index++]}");

            //        }

            //    }

            //    return;
            //}

            if (prop.GetType() == typeof(int) || prop.GetType() == typeof(float) || prop.GetType() == typeof(double))
            {
                group.Input = Generator.GenerateTextBox(viewContext, modelExplorer, prop.Name, null, null, new { @class = "form-control", @type = "number" });
            }
            else
            {
                group.Input = Generator.GenerateTextBox(viewContext, modelExplorer, prop.Name, null, null, new { @class = "form-control" });
            }
            group.TextDanger = Generator.GenerateValidationMessage(viewContext, modelExplorer, prop.Name, null, viewContext.ValidationMessageElement, new { @class = "text-danger" });
        }
 protected override void InitializeInternal()
 {
     FormGroupModel = new FormGroupModel();
 }