Canvas.Controllers.ApiController.PostEditControl C# (CSharp) Method

PostEditControl() private method

private PostEditControl ( System.Web.Mvc.FormCollection form ) : System.Web.Mvc.JsonResult
form System.Web.Mvc.FormCollection
return System.Web.Mvc.JsonResult
        public JsonResult PostEditControl(FormCollection form)
        {

            var controlId = new Guid(form["controlId"]);
            var pageId = form["pageId"];
            var controlType = form["controlType"];

            var model = Repository.GetObjectById(Convert.ToInt32(pageId));

            if (model != null)
            {

                // Finna Area hvort sem það sé inn í Grid/section eða rótar svæði sem á undir sér Control

                foreach (var area in model.Areas)
                {
                    FindAreaWithControl(area, controlId);
                }

                if (AreaControlResult != null)
                {

                    var control = AreaControlResult.Controls.FirstOrDefault(x => x.ControlID == controlId);

                    if (control != null)
                    {

                        var controlProperties = control.GetType().GetProperties().ToDictionary(x => x.Name, x => x.GetValue(control, null) ?? "").ToList();

                        foreach (var property in controlProperties)
                        {

                            if (property.Key != "Type" && property.Key != "ControlID")
                            {

                                var value = form[property.Key];

                                // If Macro control
                                // Replace single quote with double quote
                                if (controlType == "Macro" && property.Key == "Macro")
                                {
                                    value = value.Replace("'", "\"");
                                }

                                PropertyInfo prop = control.GetType().GetProperty(property.Key, BindingFlags.Public | BindingFlags.Instance);
                                if (null != prop && prop.CanWrite)
                                {
                                    prop.SetValue(control, HttpContext.Server.HtmlEncode(value), null);
                                }

                            }


                        }

                        // Ef Control er grid þá þarf að eyða út gömlum svæðum og búa til ný
                        if (controlType == "Grid")
                        {

                            var columns = form["columns"].Split(';');

                            var ListOfAreasThatHaveNotChanges = new List<CanvasArea>();

                            // Finna öll svæði sem eru undir Controli
                            var AreasInsideGrid = control.Areas;

                            bool update = true;

                            // Athuga hvort það eigi að uppfæra grid eða búa til nýtt area undir þessu controli. t.d. col-4-12345 í stað col-6-12345

                            var p = 0;
                            foreach (var col in columns)
                            {

                                string[] colValue = col.Split(':');

                                var colAreaAlis = "grid-" + colValue[0] + "-" + controlId.ToString() + "-" + p;

                                p++;

                                var AreaInsideGrid = AreasInsideGrid.FirstOrDefault(x => x.Alias == colAreaAlis);

                                if (AreaInsideGrid == null)
                                {
                                    update = false;
                                }
                                else
                                {
                                    ListOfAreasThatHaveNotChanges.Add(AreaInsideGrid);
                                }

                            }

                            if (!update)
                            {

                                // Eyða út öllum svæðum sem hafa breyst

                                var AreasToRemove = AreasInsideGrid.Intersect(ListOfAreasThatHaveNotChanges).ToList();

                                foreach (var a in AreasToRemove.ToList())
                                {
                                    AreasInsideGrid.Remove(a);
                                }

                                p = 0;
                                foreach (var column in columns)
                                {

                                    string col = column.Split(':')[0];

                                    var area = new CanvasArea
                                    {
                                        Alias = "grid-" + col + "-" + controlId.ToString() + "-" + p
                                    };


                                    control.Areas.Insert(p, area);

                                    p++;

                                }
                            }

                        }

                    }
                }
            }

            var saveStatus = Repository.SaveJson(model, Convert.ToInt32(pageId));

            return Json(new { success = saveStatus });
        }