public async Task <IActionResult> Create([Bind("Name,Description,ImagePath")] PirateGroup pirateGroup, string[] selectedPersons) { if (_context.PirateGroups.Any(group => group.Name == pirateGroup.Name)) { ViewBag.NameExists = _localizer["Name '{0}' already exists.", pirateGroup.Name]; PopulateAssignedPerson(selectedPersons); return(View(pirateGroup)); } if (ModelState.IsValid) { // Try to upload file if (!(await TryUploadFile(pirateGroup))) { PopulateAssignedPerson(selectedPersons); return(View(pirateGroup)); } // Update persons pirateGroup.Persons = new List <Person>(); foreach (var personIdStr in selectedPersons) { int personId = int.Parse(personIdStr); var person = _context.Persons.SingleOrDefault(p => p.Id == personId); pirateGroup.Persons.Add(person); person.PirateGroup = pirateGroup; } // Save DB _context.Add(pirateGroup); await _context.SaveChangesAsync(); return(RedirectToAction(nameof(Index))); } PopulateAssignedPerson(selectedPersons); return(View(pirateGroup)); }
private void UpdatePirateGourpPersons(PirateGroup pirateGroupToUpdate, string[] selectedPersons) { var selectedPersonsHS = new HashSet <string>(selectedPersons); var groupPersons = new HashSet <int>(pirateGroupToUpdate.Persons.Select(p => p.Id)); foreach (var person in _context.Persons) { if (selectedPersonsHS.Contains(person.Id.ToString())) // 本次选中这个Person { if (!groupPersons.Contains(person.Id)) // 并且这个Person之前不在Group中 { pirateGroupToUpdate.Persons.Add(person); // 则添加Person到Group person.PirateGroup = pirateGroupToUpdate; } } else // 本次没有选中这个Person { if (groupPersons.Contains(person.Id)) // 并且这个Person之前属于Group { pirateGroupToUpdate.Persons.Remove(person); // 则从Group中删除Person person.PirateGroup = null; } } } }
/// <summary> /// Try to upload file and update entity object /// </summary> /// <param name="group"></param> /// <returns>true=No error; false=Has error</returns> private async Task <bool> TryUploadFile(PirateGroup group) { // If no file to upload, return true if (HttpContext.Request.Form.Files == null) { return(true); } var file = HttpContext.Request.Form.Files.FirstOrDefault(); if (file == null || file.Length == 0) { return(true); } // Check extension string extensionMsg = CheckExtension(file); if (!string.IsNullOrEmpty(extensionMsg)) { ViewBag.WrongExtension = extensionMsg; return(false); } // Remove old image if (group.ImagePath != null) { string filePath = Path.Combine(_environment.WebRootPath, group.ImagePath); if (System.IO.File.Exists(filePath)) { System.IO.File.Delete(filePath); } } // Upload new image group.ImagePath = await UploadFile(file); return(true); }
// GET: PirateGroups/Create public IActionResult Create() { // 初始化一个空的group,且group中的list也要new。只是为了满足PopulateAssignedPerson函数的要求。 PirateGroup group = new PirateGroup(); group.Persons = new List <Person>(); PopulateAssignedPerson(group); return(View()); }
public async Task <IActionResult> Edit(int id, [Bind("Id,Name,Description,ImagePath")] PirateGroup pirateGroup, string[] selectedPersons) { if (id != pirateGroup.Id) { return(NotFound()); } var pirateGroupToUpdate = await _context.PirateGroups.Include(g => g.Persons).SingleOrDefaultAsync(g => g.Id == id); // Check if the name exists already if (_context.PirateGroups.Any(group => group.Name == pirateGroup.Name && group.Id != pirateGroup.Id)) { ViewBag.NameExists = _localizer["Name '{0}' already exists.", pirateGroup.Name]; PopulateAssignedPerson(selectedPersons); return(View(pirateGroup)); } if (ModelState.IsValid) { // Update persons // 把当前的object,用controller创建来的object更新 await TryUpdateModelAsync <PirateGroup>(pirateGroupToUpdate, "", i => i.Name, i => i.Description, i => i.ImagePath); UpdatePirateGourpPersons(pirateGroupToUpdate, selectedPersons); // Try to upload file if (!(await TryUploadFile(pirateGroupToUpdate))) { PopulateAssignedPerson(pirateGroupToUpdate); return(View(pirateGroupToUpdate)); } // Update DB try { _context.Update(pirateGroupToUpdate); await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!PirateGroupExists(pirateGroup.Id)) { return(NotFound()); } else { throw; } } return(RedirectToAction(nameof(Index))); } return(View(pirateGroup)); }
private void PopulateAssignedPerson(PirateGroup group) { var allPersons = _context.Persons; var groupPersons = new HashSet <int>(group.Persons.Select(p => p.Id)); var viewModel = new List <AssignedPerson>(); foreach (var person in allPersons) { viewModel.Add(new AssignedPerson { PersonID = person.Id, Name = person.Name, Assigned = groupPersons.Contains(person.Id) }); } ViewData["Persons"] = viewModel; }