ASP.NET Identity如何编辑已登录用户的数据?

3

我已经修改了Views/Manage/Index.cshtml文件,使其能够显示用户的电子邮件。我也修改了IndexViewModel,让它识别“Email”字符串,然后创建了一个类似于默认情况下更改电话号码的页面ChangeEmail.cshtml。

@using (Html.BeginForm("ChangeEmail", "Manage", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
    @Html.AntiForgeryToken()
    <h4>Add an email</h4>
    <hr />
    @Html.ValidationSummary("", new { @class = "text-danger" })
    <div class="form-group">
        @Html.LabelFor(model => model.Email, new { @class = "col-md-2 control-label" })
        <div class="col-md-10">
            @Html.TextBoxFor(model => model.Email, new { @class = "form-control" })

        </div>
    </div>
    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" class="btn btn-default" value="Submit" />
        </div>
    </div>
}

根据我的观察,更改密码是通过UserManager.cs中的“ChangePasswordAsync”任务完成的。是否有一种方法可以更改电子邮件而无需创建新任务?

编辑:从控制器(index)中添加更多内容:

    public async Task<ActionResult> Index(ManageMessageId? message)
            {
                ViewBag.StatusMessage =
                    message == ManageMessageId.ChangePasswordSuccess ? "Your password has been changed."
                    : message == ManageMessageId.SetPasswordSuccess ? "Your password has been set."
                    : message == ManageMessageId.SetTwoFactorSuccess ? "Your two-factor authentication provider has been set."
                    : message == ManageMessageId.Error ? "An error has occurred."
                    : message == ManageMessageId.AddPhoneSuccess ? "Your phone number was added."
                    : message == ManageMessageId.RemovePhoneSuccess ? "Your phone number was removed."
                    : message == ManageMessageId.EmailChangedSuccess ? "Your email has been changed"
                    : "";

                var userId = User.Identity.GetUserId();
                var userEmail = User.Identity.Name;
                var user = UserManager.FindById(userId);



                var model = new IndexViewModel
                {
                    HasPassword = HasPassword(),
                    PhoneNumber = await UserManager.GetPhoneNumberAsync(userId),
                    TwoFactor = await UserManager.GetTwoFactorEnabledAsync(userId),
                    Logins = await UserManager.GetLoginsAsync(userId),
                    BrowserRemembered = await AuthenticationManager.TwoFactorBrowserRememberedAsync(userId),
                    Email = user.Email,
                    City = user.City,
                    Region = user.Region


                };
                user.Email = "topkek@ucn.dk";
                UserManager.UpdateAsync(user);

                return View(model);
            }

 [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> ChangeEmail(ChangeEmailViewModel model)
        {
            if (!ModelState.IsValid)
            {
                return View(model);
            }



            return RedirectToAction("Index", new { Message = ManageMessageId.EmailChangedSuccess });
        }

userManager.UpdateAsync(user); - jamiedanq
1个回答

3
从您的ChangeEmailViewModel中获取用户的电子邮件地址,然后使用userManager.UpdateAsync(user)更新用户详细信息。

编辑

[HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> ChangeEmail(ChangeEmailViewModel model)
        {
            if (!ModelState.IsValid)
            {
                return View(model);
            }
             //Get the user's Id
            var userId = User.Identity.GetUserId(); 

            //get the user (you can modify the variables to fit yours) 
           var user = UserManager.FindByIdAsync(userId);

          //this is how to change the Email
          user.Result.Email= model.Email// **EDIT**;

         userManager.UpdateAync(user.Result);

            return RedirectToAction("Index", new { Message = ManageMessageId.EmailChangedSuccess });
        }

你能否详细说明一下?我不确定应该放在哪里。谢谢。 - crystyxn
我通过使用您的帖子添加了更多细节到答案中。 - jamiedanq
当我尝试使用你的方法时,出现了“userId在当前上下文中不存在”的错误。然而,我通过更改Index()方法(我已经更新了上面的原始帖子)来使其工作,我可以成功地将电子邮件更改为“topkek@ucn.dk”,但是我如何在ChangeEmail内部实现这一点?我似乎漏掉了什么。 - crystyxn
@crystyxn 我已经编辑了我的答案,以便在传递之前获取UserId - jamiedanq
好的,我终于搞定了!必须使用user.Result.Email = model.Email; 然后等待UserManager.UpdateAsync(user.Result); !! 这就是错误一直存在的原因,我只使用了user!非常感谢您的帮助! - crystyxn
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接