public async Task <IActionResult> UpdateUserRoleAndEmail(string id)
        {
            if (string.IsNullOrEmpty(id))
            {
                return(RedirectToAction("Users"));
            }

            var user = await _userManager.FindByIdAsync(id);

            if (user == null)
            {
                RedirectToAction("Users");
            }

            var model = new UserEditRoleAndEmailViewModel
            {
                Id                = id,
                UserName          = user.UserName,
                Email             = user?.Email,
                ApplicationRoleId = _roleManager.Roles
                                    .SingleOrDefault(r => r.Name == _userManager.GetRolesAsync(user).Result.SingleOrDefault())?.Id,
                ApplicationRoles = _roleManager.Roles.Select(r => new SelectListItem {
                    Text = r.Name, Value = r.Id
                })
                                   .ToList()
            };

            return(View(model));
        }
        public async Task <IActionResult> UpdateUserRoleAndEmail(UserEditRoleAndEmailViewModel model)
        {
            if (ModelState.IsValid)
            {
                AppUser user = await _userManager.FindByIdAsync(model.Id);

                if (user != null)
                {
                    if (!string.IsNullOrEmpty(model.Email))
                    {
                        user.Email    = model.Email;
                        user.UserName = model.Email;

                        IdentityResult result = await _userManager.UpdateAsync(user);

                        if (result.Succeeded)
                        {
                            string existingRole   = _userManager.GetRolesAsync(user).Result.SingleOrDefault();
                            string existingRoleId = _roleManager.Roles.SingleOrDefault(r => r.Name == existingRole)?.Id;
                            if (existingRoleId == null)
                            {
                                IdentityRole applicationRole = await _roleManager.FindByIdAsync(model.ApplicationRoleId);

                                if (applicationRole != null)
                                {
                                    IdentityResult newRoleResult = await _userManager.AddToRoleAsync(user, applicationRole.Name);

                                    if (newRoleResult.Succeeded)
                                    {
                                        return(RedirectToAction("Users"));
                                    }
                                }
                            }
                            else
                            {
                                if (existingRoleId != model.ApplicationRoleId)
                                {
                                    IdentityResult roleResult = await _userManager.RemoveFromRoleAsync(user, existingRole);

                                    if (roleResult.Succeeded)
                                    {
                                        IdentityRole applicationRole = await _roleManager.FindByIdAsync(model.ApplicationRoleId);

                                        if (applicationRole != null)
                                        {
                                            IdentityResult newRoleResult = await _userManager.AddToRoleAsync(user, applicationRole.Name);

                                            if (newRoleResult.Succeeded)
                                            {
                                                return(RedirectToAction("Users"));
                                            }
                                        }
                                    }
                                }
                            }
                            return(RedirectToAction("Users"));
                        }

                        foreach (var error in result.Errors)
                        {
                            ModelState.AddModelError(string.Empty, error.Description);
                        }
                    }
                }
            }

            model.ApplicationRoles = _roleManager
                                     .Roles
                                     .Select(r => new SelectListItem {
                Text = r.Name, Value = r.Id
            })
                                     .ToList();

            return(View(model));
        }