2013-10-13 3 views
5

Я пытаюсь справиться с новой системой членства, представленной в ASP.NET MVC 5, и я столкнулся с небольшой проблемой, и я уверен, что вы сможете мне помочь.MVC5 Пользовательские свойства ApplicationUser

Я иду на основе от this tutorial и введены пользовательских свойств ApplicationUser, таких как имя, фамилия, DOB и т.д.

Однако, вместо того, чтобы создать пользователь, я пытаюсь обновить вошедшие в одном. Я рассматриваю метод контроллера, который в настоящее время используется для смены пароля.

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

Как точно я хотел бы продолжить обновление фамилии ApplicationUser's? Мне нужно вызвать DbContext или?

Надеюсь, мой вопрос ясен.

ответ

6

Исследуйте IdentityManager.Store.UserManagement и 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(); 

Выше приведен пример. В основном вам необходимо изучить Store недвижимость IdentityManage.

+0

+1 Вы можете использовать CancellationToken.None from System.Threading, а не создавать BTW. – Stimul8d

+0

Удивительные ребята! благодаря – teh0wner

2

Когда мы использовали объект Users нашего контекста базы данных, мы столкнулись с другими ошибками отслеживания. В нашем приложении, мы бы получить пользователи, как такой

var user = UserManager.FindById(userId); 

Редактировать свойства:

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

И тогда мы бы сохранить его с UserManager в контроллере:

UserManager.Update(user); 

Это в настоящее время является рабочим решением для нас.

2

Отметьте объект Person как virtual в вашем определении ApplicationUser. Это сработало для меня.

public class ApplicationUser : IdentityUser 
{ 
    public virtual Person Person { get; set; } 
Смежные вопросы