2015-01-20 7 views
3

ASP.NET ID 2.x에서 역할에서 사용자를 제거하려면 어떻게합니까? 사용자에게 역할을 추가하는 데 문제가 없지만 사용자로부터 역할을 제거하려고 할 때 cannot.It에 예외 또는 오류가 없다고 언급해야합니다!ASP.NET ID 2.x의 역할에서 사용자 제거

//POST: Admin/User/Edit/5 
    [AcceptVerbs(HttpVerbs.Post)] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> Edit([Bind(Prefix = "")]UserViewModel userViewModel, List<int> availableRoles) 
    { 
     if (ModelState.IsValid) 
     { 
      List<int> newListOfRolesIDs = availableRoles; 
      List<int> oldListOfRolesIDs = UserBLL.Instance.GetRolesIDs(userViewModel.Id); 
      List<int> deletedList; 
      List<int> addedList; 
      var haschanged = oldListOfRolesIDs.ChangeTracking(newListOfRolesIDs, out deletedList, out addedList); 
      using (new EFUnitOfWorkFactory().Create()) 
      { 
       if (haschanged) 
       { 
        UserBLL.Instance.InsertRoles(addedList, userViewModel.Id); 
        UserBLL.Instance.DeleteRoles(deletedList, userViewModel.Id); 
       } 
       await UserBLL.Instance.UpdateAsync(userViewModel); 
      } 
      //ArticleBLL.Instance.UpdatePartial(articleViewModel, m => m.Title); 
      return RedirectToAction("Edit"); 
     } 
     return View(userViewModel); 
    } 

삭제 역할 방법 :

public void DeleteRoles(List<int> deleteList, int? userId) 
    { 
     if (userId != null) 
     { 
      User user = UserManager.FindByIdAsync(userId.Value).Result; 
      foreach (var i in deleteList) 
      { 
       user.Roles.Remove(new UserRole { RoleId = i, UserId = user.Id }); // What's the problem?! 
      } 
     } 
    } 

삽입 역할 방법 :

public void InsertRoles(List<int> insertList, int? userId) 
    { 
     if (userId != null) 
     { 
      User user = UserManager.FindByIdAsync(userId.Value).Result; 
      foreach (var i in insertList) 
      { 
       user.Roles.Add(new UserRole { RoleId = i, UserId = user.Id }); 
      } 
     } 
    } 

답변

9

은 무엇 당신이 찾고있는 것은 RemoveFromRoleAsync 방법이다. 예는 다음과 비슷하게 :

public async Task DeleteRolesAsync(List<string> deleteList, int? userId) 
{ 
    if (userId != null) 
    { 
     foreach (var roleName in deleteList) 
     { 
      IdentityResult deletionResult = await UserManager.RemoveFromRoleAsync(userId, roleName); 
     } 
    } 
} 

이미 사용자의 ID가있는 경우, (당신은 사용자가 실제로 존재하는지 확인하려는 경우에만 사용자를 다시받을 필요가 없습니다, 당신 if-statement로 foreach를 래핑해야 함). 삭제 방법은 사용자를 역할에서 삭제하기 위해 ID 대신 역할의 이름이 필요합니다. 작업 결과 (deletureResult에 저장)를 사용하여 작업이 성공적으로 수행되었는지 확인할 수 있습니다. 사용자 관리자의 이름 (예 : UserManager)은 구현에 따라 다를 수 있습니다.

0

같은 문제가있어서 사용을 끝내면 RemoveFromRolesAsync (string userId, params string [] roles) 메서드 UserManager에서 가져 왔습니다.

배열에서 역할 이름을 사용하면 작동합니다. 하지만 사용자가 배열의 역할 중 하나에 있지 않으면 사용자가 배열의 모든 역할에서 제거되지 않습니다. 모두 또는 전체 없음

  var usr = UserManager.FindById(usrV.ID.ToString()); 

      string[] deleteList; 
      deleteList= new string[1]; 
      deleteList[0] = "Engineer"; 

      var rresult1 = UserManager.RemoveFromRolesAsync(usr.Id, deleteList); 

희망이 도움
관련 문제