2017-09-28 3 views
1

J'essaie de mettre à jour les rôles utilisateur à partir d'une liste déroulante. Lorsque je sélectionne le nom d'utilisateur (adresse e-mail) et le rôle (par exemple SuperUser, Admin, Utilisateur) que je veux leur attribuer et cliquez sur Soumettre, je soumets tout comme il se doit. Ce que j'ai trouvé est que pour chaque rôle que je sélectionne pour le même utilisateur à mettre à jour, il crée une entrée de données pour ce rôle et ajoute l'utilisateur plus d'une fois. Cela fait en sorte que le dernier enregistrement entré est toujours le userRole.Ajout et non mise à jour des rôles utilisateur

Ce que je ne peux pas comprendre est comment une fois que je trouve l'utilisateur, pour supprimer le RoleId actuel et ajouter le nouveau.

Si vous souhaitez un autre code de la vue, le modèle ou toute autre chose s'il vous plaît faites le moi savoir et l'afficher.

Image en bas par exemple de ce qui se passe dans la base de données.

Contrôleur

[HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> RegisterRole(RegisterViewModel model, ApplicationUser user) 
    { 

     var userId = db.AspNetUsers.Where(i => i.UserName == user.UserName).Select(s => s.Id); 
     string updateId = ""; 
     foreach (var i in userId) 
     { 
      updateId = i.ToString(); 
     } 
     //Assign Role to user here 
     await this.UserManager.AddToRoleAsync(updateId, model.Name); 

     return RedirectToAction("Index", "Employee"); 
    } 

Repeat records

Répondre

2

Il existe deux méthodes qui peuvent lui être utiles pour vous: 1) GetRolesAsync pour obtenir tous les rôles utilisateur, et 2) les supprimer à l'aide RemoveFromRoleAsync avant d'ajouter nouveau rôle

var roles = await this.UserManager.GetRolesAsync(userId); 
await this.UserManager.RemoveFromRolesAsync(userId, roles.ToArray()); 

//then add new role 
await this.UserManager.AddToRoleAsync(userId, roleName); 

Modifier:

[HttpPost] 
[AllowAnonymous] 
[ValidateAntiForgeryToken] 
public async Task<ActionResult> RegisterRole(RegisterViewModel model, ApplicationUser user) 
{ 

    //in case user is being passed in without Id (unlikely), you could use user manager to get the full user object 
    //user = await this.UserManager.FindByNameAsync(user.UserName); 

    //get all user's roles, and remove them 
    var roles = await this.UserManager.GetRolesAsync(user.Id); 
    await this.UserManager.RemoveFromRolesAsync(user.Id, roles.ToArray()); 

    //Assign Role to user here 
    await this.UserManager.AddToRoleAsync(user.Id, model.Name); 

    return RedirectToAction("Index", "Employee"); 
} 
+0

et je les mettrais après la boucle foreach correct? – whisk

+1

oui, mais pourquoi courez-vous faire une foreach? semble que vous avez déjà reçu un utilisateur, vous pouvez donc simplement utiliser user.Id pour userId. Je vais éditer ma réponse. –

+0

mis à jour ma réponse, espérons que cela aide à résoudre le problème. –