public override async Task <IViewProviderResult> BuildUpdateAsync(CategoryAdmin category, IViewProviderContext context) { // Get posted role names var rolesToAdd = GetRolesToAdd(); // Update model var model = new EditUserRolesViewModel { SelectedRoles = rolesToAdd }; if (!await context.Updater.TryUpdateModelAsync(model)) { return(await BuildEditAsync(category, context)); } if (context.Updater.ModelState.IsValid) { // Remove roles in two steps to prevent an iteration on a modified collection var rolesToRemove = new List <string>(); foreach (var role in await _categoryManager.GetRolesAsync(category)) { if (!rolesToAdd.Contains(role)) { rolesToRemove.Add(role); } } foreach (var role in rolesToRemove) { await _categoryManager.RemoveFromRoleAsync(category, role); } // Add new roles foreach (var role in rolesToAdd) { if (!await _categoryManager.IsInRoleAsync(category, role)) { await _categoryManager.AddToRoleAsync(category, role); } } } return(await BuildEditAsync(category, context)); }