5

我正在尝试掌握 ASP.NET MVC 5 中引入的新会员系统,我遇到了一个小问题,我很确定您将能够帮助我解决这个问题。

我将以本教程为基础,并向 ApplicationUser 引入自定义属性,例如姓名、姓氏、出生日期等。

但是,我没有创建用户,而是尝试更新当前登录的用户。我正在查看当前用于更改密码的控制器方法。

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 的姓氏?我需要调用 DbContext 吗?

我希望我的问题很清楚。

4

3 回答 3

6

探索IdentityManager.Store.UserManagementIdentityManager.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.

于 2013-10-14T15:32:25.150 回答
3

当我们使用数据库上下文的用户对象时,我们遇到了其他跟踪错误。在我们的应用程序中,我们将这样检索用户

var user = UserManager.FindById(userId);

编辑属性:

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

然后我们将它与控制器中的 UserManager 一起保存:

UserManager.Update(user);

这是目前对我们来说可行的解决方案。

于 2014-12-14T03:33:41.967 回答
2

在 ApplicationUser 定义中将 Person 对象标记为虚拟。这对我有用。

public class ApplicationUser : IdentityUser
{
    public virtual Person Person { get; set; }
于 2015-07-27T19:53:29.227 回答