2013-10-13 18 views
5

Sto cercando di familiarizzare con il nuovo sistema di Membership introdotto in ASP.NET MVC 5 e mi sono imbattuto in un piccolo problema che sono abbastanza sicuro che sarà in grado di aiutarmi.MVC5 ApplicationUser Proprietà personalizzate

Vado in base al largo this tutorial e hanno introdotto le proprietà personalizzate per ApplicationUser quali nome, cognome, data di nascita, ecc

Tuttavia, invece di creare l'utente, che sto cercando di aggiornare attualmente connesso in uno. Sto guardando il metodo del controller che è attualmente utilizzato per cambiare la password.

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); 
    } 

In che modo esattamente procedere all'aggiornamento di un Cognome di ApplicationUser, ad esempio? Devo chiamare il DbContext o?

Spero che la mia domanda sia chiara.

risposta

6

Esplora IdentityManager.Store.UserManagement e 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(); 

Sopra il codice è solo un esempio. Fondamentalmente è necessario esplorare la proprietà Store di IdentityManage.

+0

+1 È possibile utilizzare CancellationToken.None da System.Threading anziché creare una BTW. – Stimul8d

+0

cose fantastiche ragazzi! Grazie – teh0wner

2

Quando abbiamo utilizzato l'oggetto Utenti del nostro contesto di database, abbiamo riscontrato altri errori di tracciamento. Nella nostra applicazione, vorremmo recuperare gli utenti in quanto tale

var user = UserManager.FindById(userId); 

Modificare le proprietà:

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

E poi ci sarebbe salvarlo con l'UserManager nel controller:

UserManager.Update(user); 

Questo è attualmente una soluzione funzionante per noi.

2

Contrassegnare l'oggetto Persona come virtuale nella definizione ApplicationUser. Questo ha funzionato per me.

public class ApplicationUser : IdentityUser 
{ 
    public virtual Person Person { get; set; } 
Problemi correlati