public ActionResult Change(ChangeContentTypeViewModel model)
        {
            // список контроллеров и их экшенов
            List <ControllerAction> caList = new List <ControllerAction>();

            // десериализуем 'model.caList'
            var new_caList = json.Deserialize(model.caList, caList.GetType());

            // наполняем список
            caList         = (List <ControllerAction>)new_caList;
            ViewBag.caList = caList;

            // список групп типов контента
            List <ContentGroup> contentgrouplist = contenttype.GetContentTypeGroups(null);

            ViewBag.ContentGroupList = contentgrouplist;

            // валидация модели
            if (ModelState.IsValid)
            {
                int selected = 0;
                int title    = 0;

                // проверка списка экшенов на Selected (должен быть хотя бы один и его название)
                foreach (var i in model.Actions)
                {
                    if (i.Selected)
                    {
                        selected = 1;
                        title    = 0; // сброс флага названия, т.к. найден отмеченный экшен

                        // пусто / null ли название
                        if (!string.IsNullOrEmpty(i.Title))
                        {
                            title = 1;
                        }
                        else
                        {
                            break; // выход из цикла, если нет названия для текущего экшена
                        }
                    }
                }

                // если выбран хотя бы один экшен и есть его название
                if (selected == 1 && title == 1)
                {
                    // восстанавливаем нулевую запись экшена - контроллер
                    Permission action = new Permission()
                    {
                        Name     = model.Controller,
                        Title    = "",
                        Selected = true
                    };

                    // помещаем наш контроллер в начало 'model.Actions'
                    model.Actions.Insert(0, action);

                    // наполняем объект данными
                    ContentType ct = new ContentType()
                    {
                        Id           = model.Id,
                        Name         = model.Name,
                        Controller   = model.Controller,
                        Actions      = model.Actions,
                        contentGroup = model.contentGroup
                    };

                    // обновление данных типа контента
                    if (contenttype.ChangeContentType(ct))
                    {
                        // обновляем хранилище ролей
                        RoleConfig.RepositoryRoles();

                        // лог
                        logging.Logged(
                            "Info"
                            , "Пользователь " + User.Identity.Name + " изменил тип контента: '" + model.Name + "'"
                            , this.GetType().Namespace
                            , this.GetType().Name
                            );

                        return(Json(new { result = "Redirect", url = Url.Action("Index", "ContentType") }));
                    }

                    // удаляем из 'model.Actions' нулевой элемент - контроллер,
                    // чтобы не нарушить структуру при возвращении 'ChangePartial'
                    model.Actions.RemoveAt(0);

                    ModelState.AddModelError("", "Этот тип контента уже используется");
                }
                else
                {
                    ModelState.AddModelError("", "Укажите хотя бы один экшен. Для указанных экшенов название обязательно.");
                }
            }
            else
            {
                ModelState.AddModelError("", "Ошибка, пожалуйста проверьте данные");
            }

            return(PartialView(model));
        }
        public ActionResult Change(string obj)
        {
            // модель
            ChangeContentTypeViewModel model = new ChangeContentTypeViewModel();

            // список контроллеров и их экшенов
            List <ControllerAction> caList = ControllerActionList.GetList();

            // данные Всех типов контента
            List <ContentType> ctAll = new List <ContentType>();

            ctAll = contenttype.ContentTypeList(null, "");

            // данные типа контента по 'Name'
            List <ContentType> ct = new List <ContentType>();

            ct = contenttype.ContentTypeList(null, obj);

            // список групп типов контента
            List <ContentGroup> contentgrouplist = contenttype.GetContentTypeGroups(null);

            ViewBag.ContentGroupList = contentgrouplist;

            // наполняем модель
            model.Id           = ct[0].Id;
            model.Name         = ct[0].Name;
            model.Controller   = ct[0].Controller;
            model.contentGroup = ct[0].contentGroup;

            // список контроллеров и их экшенов из сборки 'WebSphere.WebUI'
            foreach (var i in caList.ToList())
            {
                // список контроллеров и их экшенов из БД
                foreach (var j in ctAll)
                {
                    // удаляем из 'caList' занятые контроллеры с экшенами, кроме текущего контроллера 'ct[0].Controller'
                    if (i.Controller == j.Controller && i.Controller != ct[0].Controller && j.Actions[0].Selected)
                    {
                        caList.Remove(i);
                    }
                }
            }

            // закидываем пересобранный список во 'ViewBag'
            ViewBag.caList = caList;

            // сериализуем 'caList' для 'ChangePartial'
            model.caList = json.Serialize(caList);

            // удаляем контроллер из списка экшенов, кот. в 'ct[0]', оставляем только экшены
            ct[0].Actions.RemoveAt(0);

            // прогоняем весь список экшенов по текущему контроллеру в 'ct[0]' по 'caList'
            foreach (var i in caList)
            {
                // поиск контроллера в списке
                if (i.Controller == ct[0].Controller)
                {
                    // экшены
                    List <Permission> actions = new List <Permission>();

                    // прогоняем все экшены
                    foreach (var j in i.Actions)
                    {
                        // экшен
                        Permission action = new Permission();

                        action.Name     = j;
                        action.Selected = false; // по-умолчанию
                        action.Title    = "";

                        // ищем совпадения экшенов по 'ContentType', кот. в 'ct[0]' для того, чтобы
                        // указать 'Selected' в общий список экшенов
                        // данный подход необходим в случае, если в контроллер добавились новые экшены и
                        // мы должны видеть их в списке
                        foreach (var f in ct[0].Actions)
                        {
                            if (j == f.Name)
                            {
                                action.Selected = f.Selected;
                                action.Title    = f.Title;
                            }
                        }

                        // добавляем в экшены
                        actions.Add(action);
                    }

                    // добавляем в модель
                    model.Actions = actions;
                }
            }

            return(PartialView(model));
        }