2017-02-16 6 views
0

In meinem Volk Controller habe ich die folgenden Zeilen:Httpcontext Null Wenn AddToRoleAsync

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Edit(PersonViewModel pvm) 
    { 
     if (ModelState.IsValid) 
     { 
      var person = db.people.Where(x => x.PersonId == pvm.PersonId).FirstOrDefault(); 
      var usr = new AccountController(); 
      usr.UserManager.AddToRoleAsync(person.NetId, pvm.SetRole); 
      person.CurrentRole = pvm.SetRole; 
      db.SaveChanges(); 
     } 
     return View(pvm); 
    } 

Wenn die UserManager.AddToRoleAsync() Methode ich hier ein NULL-Verweis Ausnahme erhalten im AccountController:

public ApplicationUserManager UserManager 
{ 
    get 
    { 
     return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); 
    } 
    private set 
    { 
     _userManager = value; 
    } 
} 

Warum ist HttpContext null? Liegt es daran, dass ich eine neue AccountController instanziiere? Wenn ja, wie sonst sollte ich bei UserManager gehen, damit ich einen Benutzer zu einer Rolle hinzufügen kann? Wie fügt man einen Benutzer zu einer Rolle von einem anderen Controller hinzu? Scheint so, als wäre dies ein häufiges Problem, da Benutzerverwaltung eine Sache ist, die die Leute wollen.

Antwort

0

Also musste ich einen Berater bezahlen, um diese Frage zu beantworten. Hier ist die Antwort.

Da sowohl der AccountController als auch der PeopleController beide von Controller erben, wo der HttpContext gesetzt ist, kann ich keinen neuen AccountController instantiieren, weil dann der Kontext verloren geht, den ich sowieso schon mit dem PeopleController habe. Die Antwort ist also, dass, wenn Usermanager von außerhalb des Account ruft alles, was ich tun müssen, ist verwenden Sie die folgende:

var usr = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); 

So zum Beispiel im Zusammenhang mit meinem Code:

 [HttpPost] 
     [ValidateAntiForgeryToken] 
     public async Task<ActionResult> Edit(PersonViewModel pvm) 
     { 
      if (ModelState.IsValid) 
      { 
       List<IdentityRole> roles = adb.Roles.ToList(); 
       var person = db.people.Where(x => x.PersonId == pvm.PersonId).FirstOrDefault(); 
       var usr = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); 
       foreach (var x in roles) 
       { 
        await usr.RemoveFromRoleAsync(person.NetId, x.Name); 
       } 
       await usr.AddToRoleAsync(person.NetId, pvm.SetRole); 
       person.CurrentRole = pvm.SetRole; 
       db.SaveChanges(); 
       adb.SaveChanges(); 
      } 
      return RedirectToAction("Index"); 
     } 
+0

Sie sollten auch prüfen, Erstellen einer Service-Schicht, in der Sie Ihre Aufrufe an die Datenbank tätigen und die benötigten Daten zurückgeben, anstatt diese Datenbankaufrufe in Ihren Aktionen auszuführen. Sie werden auch eine bessere Trennung der Konzessionen erhalten, wenn Sie Dependency Injection verwenden, um Ihre Dienste Ihren Controllern zur Verfügung zu stellen. –

Verwandte Themen