public async Task <IActionResult> HideTheme(int?id) { // Если ИД пустой, ошибка if (id == null) { return(NotFound()); } // Получаем нужный модуль по его ИД var module = _context.TheoryModule.SingleOrDefault(x => x.Id == id); if (module == null) { return(NotFound()); } // Передаём в представление название темы ViewData["ModuleName"] = module.Name; // Получаем список всех студентов и тех, для которых эта тема скрыта var students = new List <ApplicationUser>(); foreach (var user in _userManager.Users) { if (!(await _userManager.IsInRoleAsync(user, "teacher"))) { students.Add(user); } } var hiddenUsers = students.Where(x => x.HiddenThemes.Split('&').Any(t => t == id.ToString())).Select(x => x.Id).ToList(); // Создаём модель, в которую записываем ИД темы и списки, полученные ранее HideThemeViewModel model = new HideThemeViewModel { ModuleId = (int)id, AllUsers = students, HiddenUsers = hiddenUsers }; // Передаём модель в представление return(View(model)); }
public async Task <IActionResult> HideTheme(HideThemeViewModel model) { // Получаем список всех студентов и тех, для которых эта тема скрыта var students = new List <ApplicationUser>(); foreach (var user in _userManager.Users) { if (!(await _userManager.IsInRoleAsync(user, "teacher"))) { students.Add(user); } } var hiddenUsers = students.Where(x => x.HiddenThemes.Split('&').Any(t => t == model.ModuleId.ToString())).Select(x => x.Id).ToList(); if (model.HiddenUsers == null) { model.HiddenUsers = new List <string>(); } // Получаем пользователей, для которых эта тема стала скрытой var addedUsers = model.HiddenUsers.Except(hiddenUsers); // Получаем пользователей, для которых эта тема перестала быть скрытой var removedUsers = hiddenUsers.Except(model.HiddenUsers); foreach (string id in addedUsers) { // Получаем пользователя по ИД var user = students.SingleOrDefault(x => x.Id == id); // Если пользователь не найден, продолжаем if (user == null) { continue; } if (String.IsNullOrEmpty(user.HiddenThemes)) { // Если список скрытых для него тем - пустой, добавляем туда ИД этой темы user.HiddenThemes = model.ModuleId.ToString(); _context.Update(user); } else if (!user.HiddenThemes.Split('&').Any(t => t == model.ModuleId.ToString())) { // Если в списке скрытых для него тем не было этой темы раньше, добавляем её в конец. user.HiddenThemes += "&" + model.ModuleId; _context.Update(user); } } foreach (string id in removedUsers) { // Получаем пользователя по ИД var user = students.SingleOrDefault(x => x.Id == id); // Если пользователь не найден, продолжаем if (user == null) { continue; } // Если нет скрытых от него тем, пропускаем его if (String.IsNullOrEmpty(user.HiddenThemes)) { continue; } // Разбиваем строку из БД на список скрытых тем var hiddenThemes = user.HiddenThemes.Split('&').ToList(); if (hiddenThemes.Any(t => t == model.ModuleId.ToString())) { // Если эта тема для него скрыта, удаляем её из списка hiddenThemes.Remove(model.ModuleId.ToString()); if (hiddenThemes.Count == 0) { // Если не осталось больше скрытых тем, сохраняем в БД пустую строку user.HiddenThemes = ""; } else { // Если есть другие скрытые темы, составляем новую строку, которая будет храниться в БД string s = ""; for (int i = 0; i < hiddenThemes.Count - 1; i++) { s += hiddenThemes[i] + "&"; } s += hiddenThemes[hiddenThemes.Count - 1]; user.HiddenThemes = s; } _context.Update(user); } } await _context.SaveChangesAsync(); // Возвращаемся к просмотру темы return(RedirectToAction("Details", new { id = model.ModuleId })); }