2017-09-28 2 views
1

Ich versuche, die Benutzerrollen aus einem Dropdown zu aktualisieren. Wenn ich den Benutzernamen (E-Mail-Adresse) und die Rolle (z. B. SuperUser, Admin, Benutzer), die ich ihnen zuweisen möchte, auswähle und auf "Senden" klicke, übergebe ich alles so, wie es sollte. Was ich gefunden habe, ist, dass ich für immer die gleiche Rolle für den gleichen Benutzer auswähle, um sie zu aktualisieren, einen Dateneintrag für diese Rolle erstellt und den Benutzer mehr als einmal hinzufügt. Dies macht es so, dass der zuletzt eingegebene Datensatz immer die userRole ist.Benutzerrollen hinzufügen und nicht aktualisieren

Was ich nicht herausfinden kann ist, wie ich den Benutzer finde, um die aktuelle RoleId zu löschen und die neue hinzuzufügen.

Wenn Sie irgendwelche anderen Code aus der Ansicht, Modell oder irgendetwas anderes möchten, lassen Sie mich bitte wissen und krank Posten.

Bild unten zum Beispiel, was passiert in der DB.

-Controller

[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

Antwort

2

Es gibt zwei Methoden, die Ihnen nützlich sein können: 1) GetRolesAsync die Benutzer alle Rollen zu bekommen, und 2) löschen sie alle RemoveFromRoleAsync verwenden, bevor Hinzufügen neue Rolle

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

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

Bearbeiten:

[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

und ich würde diese nach der foreach-Schleife richtig setzen? – whisk

+1

ja, aber warum rennst du eine foreach? Es scheint, dass Sie bereits einen Benutzer erhalten haben, also können Sie einfach user.Id für userId verwenden. Ich werde meine Antwort bearbeiten. –

+0

aktualisiert meine Antwort, hoffe, dass das Problem zu lösen hilft. –

Verwandte Themen