2013-10-13 10 views
5

Próbuję opanować nowy system członkostwa wprowadzony w ASP.NET MVC 5 i natknąłem się na mały problem, z którego jestem pewien, że będziesz w stanie mi pomóc.Właściwości niestandardowe aplikacji użytkownika MVC5 ApplicationUser

ja jadę w oparciu off this tutorial i wprowadziły właściwości niestandardowych do ApplicationUser takie jak imię, nazwisko, DOB, itp

Jednak zamiast tworzyć użytkownikowi, staram się aktualizować aktualnie zalogowanego w jednym. Patrzę na metodę kontrolera, która jest obecnie używana do zmiany hasła.

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

W jaki dokładnie sposób mam aktualizować nazwę użytkownika ApplicationUser? Czy muszę wywołać DbContext lub?

Mam nadzieję, że moje pytanie jest jasne.

Odpowiedz

6

Przeglądaj IdentityManager.Store.UserManagement i 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(); 

Powyższy kod jest tylko przykładowy. Zasadniczo musisz poznać właściwość Store pod numerem IdentityManage.

+0

+1 Możesz użyć CancellationToken.None z System.Threading zamiast tworzyć jedną BTW. – Stimul8d

+0

Niesamowici faceci! Dzięki – teh0wner

2

Kiedy użyliśmy obiektu Users naszego kontekstu bazy danych, natrafiliśmy na inne błędy śledzenia. W naszej aplikacji, chcielibyśmy odzyskać użytkowników jako taki

var user = UserManager.FindById(userId); 

edytować właściwości:

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

I wtedy będziemy zapisać go z UserManager w kontrolerze:

UserManager.Update(user); 

To jest obecnie działa dla nas rozwiązanie.

2

Oznacz obiekt Person jako wirtualny w definicji ApplicationUser. To działało dla mnie.

public class ApplicationUser : IdentityUser 
{ 
    public virtual Person Person { get; set; } 
Powiązane problemy