public ActionResult Add()
        {
            // ActionResult для ajax BeginForm
            ViewBag.ActRes = "Add";

            // модель
            CreateChangeRoleViewModel model = new CreateChangeRoleViewModel();

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

            // закидываем список групп типов контента
            ViewBag.cgList = cgList;

            // список типов контента
            List <ContentType> ctList = contenttype.ContentTypeList(null, "");

            // если список типов контента пуст, то невозможно создать роль
            ViewBag.Empty_ctList = ctList.Count() > 0 ? 1 : 0;

            // перебираем 'ctLict', нам нужны только 'Selected' экшены
            foreach (var i in ctList)
            {
                foreach (var j in i.Actions.ToList())
                {
                    // если Selected = false, то удаляем
                    if (!j.Selected)
                    {
                        i.Actions.Remove(j);
                    }
                }
            }

            // перебираем 'ctLict', теперь все 'Selected' ставим в false
            foreach (var i in ctList)
            {
                foreach (var j in i.Actions)
                {
                    j.Selected = false;
                }

                // вовращаем 'Selected = true' в нулевой позиции - там контроллер
                i.Actions[0].Selected = true;
            }

            // наполняем модель
            model.ContentTypes = ctList;

            return(PartialView("CreateChangeRole", model));
        }
        public ActionResult Change(CreateChangeRoleViewModel model)
        {
            // ActionResult для ajax BeginForm
            ViewBag.ActRes = "Change";

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

            // закидываем список групп типов контента
            ViewBag.cgList = cgList;

            // если список типов контента пуст, то невозможно создать роль (он уже не пуст)
            ViewBag.Empty_ctList = 1;

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

                // проверка списка экшенов (мин. 1 должен быть 'Selected', исключая контроллер)
                foreach (var i in model.ContentTypes)
                {
                    // отключаем 'Selected' у контроллера
                    i.Actions[0].Selected = false;

                    // остальные экшены
                    foreach (var j in i.Actions)
                    {
                        if (j.Selected)
                        {
                            selected = 1;
                        }
                    }

                    // включаем 'Selected' у контроллера
                    i.Actions[0].Selected = true;
                }

                // если выбрано хотя бы одно разрешение
                if (selected == 1)
                {
                    // изменение группы пользователей
                    if (account.ChangeRole(model.Id, model.Name, model.ContentTypes))
                    {
                        // обновляем хранилище ролей
                        RoleConfig.RepositoryRoles();

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

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

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

            return(PartialView("CreateChangeRole", model));
        }
        public ActionResult Change(string obj)
        {
            // ActionResult для ajax BeginForm
            ViewBag.ActRes = "Change";

            // модель
            CreateChangeRoleViewModel model = new CreateChangeRoleViewModel();

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

            // если список типов контента пуст, то невозможно создать роль
            ViewBag.Empty_cgList = cgList.Count() > 0 ? 1 : 0;

            // закидываем список групп типов контента
            ViewBag.cgList = cgList;

            // список типов контента
            List <ContentType> ctList = contenttype.ContentTypeList(null, "");

            // если список типов контента пуст, то невозможно создать роль
            ViewBag.Empty_ctList = ctList.Count() > 0 ? 1 : 0;

            // получаем данные роли 'obj' из списка ролей 'RoleConfig.Roles'
            var role = account.GetRoleData(obj, RoleConfig.GetAllRoles());

            // перебираем 'ctLict', нам нужны только 'Selected' экшены
            foreach (var i in ctList)
            {
                foreach (var j in i.Actions.ToList())
                {
                    // если Selected = false, то удаляем
                    if (!j.Selected)
                    {
                        i.Actions.Remove(j);
                    }
                }
            }

            // перебираем 'ctLict', теперь все 'Selected' ставим в false
            // кроме 'obj'
            foreach (var i in ctList)
            {
                // список разрешений в 'ctList' по 'i'
                foreach (var j in i.Actions)
                {
                    j.Selected = false; // по-умолчанию

                    // список разрешений 'role'
                    foreach (var f in role.Permissions)
                    {
                        // ищем контроллер
                        if (i.Actions[0].Name == f.Name)
                        {
                            // разрешения роли
                            foreach (var g in f.Permission)
                            {
                                // если экшены совпали
                                if (j.Name == g.Name)
                                {
                                    // если 'Selected', то и тип контента 'Selected'
                                    if (g.Selected)
                                    {
                                        i.Selected = true;
                                    }

                                    j.Selected = g.Selected;
                                }
                            }

                            break; // на  след. итерацию, т.к. контроллер может быть только один
                        }
                    }
                }

                // вовращаем 'Selected = true' в нулевой позиции - там контроллер
                i.Actions[0].Selected = true;
            }

            // наполняем модель
            model.Id           = role.Id;
            model.Name         = role.Name;
            model.ContentTypes = ctList;

            return(PartialView("CreateChangeRole", model));
        }