Exemple #1
0
        public async Task <ActionResult> Edit(EditUserViewModel editUser, params string[] selectedRole)
        {
            if (ModelState.IsValid)
            {
                var user = await UserManager.FindByIdAsync(editUser.Id);

                if (user == null)
                {
                    return(HttpNotFound());
                }

                user.Id = editUser.Id;
                //user.UserName = editUser.UserName; // if email is NOT exact, this will cause new user.
                user.Email     = editUser.Email;
                user.FirstName = editUser.FirstName;
                user.LastName  = editUser.LastName;
                user.IsClient  = editUser.IsClient;
                user.ClientID  = editUser.ClientID;
                user.Active    = editUser.Active;
                // Update User Information
                await UserManager.UpdateAsync(user);

                // Client / Roles
                var client = db.Clients.FirstOrDefaultAsync(x => x.ClientID == editUser.ClientID);
                if (client != null)
                {
                    selectedRole = selectedRole ?? new string[] { };
                    var existRoles = await UserManager.GetRolesAsync(user.Id);

                    // add new roles
                    var result = await UserManager.AddToRolesAsync(user.Id, selectedRole.Except(existRoles).ToArray());

                    // remove deleted roles
                    if (result.Succeeded)
                    {
                        result = await UserManager.RemoveFromRolesAsync(user.Id, existRoles.Where(ur => !selectedRole.Contains(ur)).ToArray());
                    }

                    if (!result.Succeeded)
                    {
                        ModelState.AddModelError("", result.Errors.First());
                        return(View());
                    }
                }


                // Applications
                {
                    editUser.SelectedApplications = editUser.SelectedApplications ?? new int[] { };

                    List <UserApplication> existUserApplications = db.UserApplications.Where(ua => ua.UserID == editUser.Id).ToList();
                    var userApplicationsToDelete = existUserApplications.Where(ua => !editUser.SelectedApplications.Contains(ua.ApplicationID));
                    var userApplicationIdToAdd   = editUser.SelectedApplications.Except(existUserApplications.Select(ua => ua.ApplicationID));

                    db.UserApplications.RemoveRange(userApplicationsToDelete);
                    db.UserApplications.AddRange(userApplicationIdToAdd.Select(uaid => new UserApplication
                    {
                        ApplicationID = uaid,
                        UserID        = editUser.Id
                    }));
                }

                await db.SaveChangesAsync();

                return(RedirectToAction("Index"));
            }
            ModelState.AddModelError("", "Something failed.");
            return(View());
        }