我正在尝试掌握ASP.NET MVC 5中引入的新成员系统,我遇到了一个小问题,我相信你能够帮助我。
我将基于this tutorial,并向ApplicationUser引入了自定义属性,例如Name,Surname,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的姓氏?我需要调用DbContext还是?
我希望我的问题很明确。
答案 0 :(得分: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
的{{1}}属性。
答案 1 :(得分:3)
当我们使用数据库上下文的Users对象时,我们遇到了其他跟踪错误。在我们的应用程序中,我们将检索用户
var user = UserManager.FindById(userId);
编辑属性:
user.StorageName = "gooblygook";
//whatever other properties you would like to use
然后我们将使用控制器中的UserManager保存它:
UserManager.Update(user);
这对我们来说是一个有效的解决方案。
答案 2 :(得分:2)
在ApplicationUser定义中将Person对象标记为虚拟。这对我有用。
public class ApplicationUser : IdentityUser
{
public virtual Person Person { get; set; }