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)); }