2013-10-13 14 views
5

Ich versuche, mit dem neuen Mitgliedschaftssystem in ASP.NET MVC 5 in den Griff zu bekommen, und ich bin auf ein kleines Problem gestoßen, bei dem ich ziemlich sicher bin, dass Sie mir helfen können.MVC5 ApplicationUser benutzerdefinierte Eigenschaften

ich this tutorial basierte weg werde und haben benutzerdefinierte Eigenschaften ApplicationUser wie Name eingeführt, Nachname, Geburtsdatum usw.

Anstatt jedoch den Benutzer zu schaffen, ich versuche, in einer der aktuell angemeldeten zu aktualisieren. Ich betrachte die Controller-Methode, die derzeit verwendet wird, um das Passwort zu ändern.

public async Task<ActionResult> Manage(ManageUserViewModel model) 
     { 
      string userId = User.Identity.GetUserId(); 
      bool hasLocalLogin = await IdentityManager.Logins.HasLocalLoginAsync(userId); 
      ViewBag.HasLocalPassword = hasLocalLogin; 
      ViewBag.ReturnUrl = Url.Action("Manage"); 

      if (hasLocalLogin) 
      {    
       if (ModelState.IsValid) 
       { 
        IdentityResult result = await IdentityManager.Passwords.ChangePasswordAsync(User.Identity.GetUserName(), model.OldPassword, model.NewPassword); 
        if (result.Success) 
        { 
         return RedirectToAction("Manage", new { Message = "Your password has been changed." }); 
        } 
        else 
        { 
         AddErrors(result); 
        } 
       } 
      } 
      else 
      { 
       // User does not have a local password so remove any validation errors caused by a missing OldPassword field 
       ModelState state = ModelState["OldPassword"]; 
       if (state != null) 
       { 
        state.Errors.Clear(); 
       } 

       if (ModelState.IsValid) 
       { 
        // Create the local login info and link it to the user 
        IdentityResult result = await IdentityManager.Logins.AddLocalLoginAsync(userId, User.Identity.GetUserName(), model.NewPassword); 
        if (result.Success) 
        { 
         return RedirectToAction("Manage", new { Message = "Your password has been set." }); 
        } 
        else 
        { 
         AddErrors(result); 
        } 

      } 
     } 

     // If we got this far, something failed, redisplay form 
     return View(model); 
    } 

Wie genau würde ich fortfahren, den Nachnamen eines ApplicationUsers zu aktualisieren? Muss ich den DbContext aufrufen oder?

Ich hoffe meine Frage ist klar.

Antwort

6

Erkunden Sie IdentityManager.Store.UserManagement und IdentityManager.Store.Users.

ApplicationUser cUser = (ApplicationUser) await IdentityManager.Store.Users.FindByNameAsync(HttpContext.User.Identity.Name, new System.Threading.CancellationToken()); 
cUser.Surname = "New Something"; 
IdentityResult result1 = await IdentityManager.Store.SaveChangesAsync(); 

Der obige Code ist nur ein Beispiel. Grundsätzlich müssen Sie die Store Eigenschaft von IdentityManage erkunden.

+0

+1 Sie können CancellationToken.None von System.Threading verwenden, anstatt ein BTW zu erstellen. – Stimul8d

+0

Tolle Sachen Jungs! Vielen Dank – teh0wner

2

Als wir das Users-Objekt unseres Datenbankkontextes verwendeten, traten andere Tracking-Fehler auf. In unserer Anwendung würden wir die Nutzer als solche

var user = UserManager.FindById(userId); 

bearbeiten rufen die Eigenschaften:

user.StorageName = "gooblygook"; 
//whatever other properties you would like to use 

Und dann würden wir es mit dem Usermanager in der Steuerung speichern:

UserManager.Update(user); 

Dies ist derzeit eine funktionierende Lösung für uns.

2

Markieren Sie das Objekt Person als virtuell in Ihrer ApplicationUser-Definition. Das hat für mich funktioniert.

public class ApplicationUser : IdentityUser 
{ 
    public virtual Person Person { get; set; } 
Verwandte Themen