Обновление пользователя с помощью UserManager.Update () in ASP.NET идентичность 2
я использую ASP.NET Identity 2
на и я хочу обновить Student
данные с помощью UserManager.Update()
метод. Однако, как я наследую от ApplicationUser
класс, мне нужна карта Student
до ApplicationUser
перед вызовом метода update. С другой стороны, при использовании подхода, который я также использовал для создания нового студента, возникает ошибка из-за параллелизма при создании нового экземпляра, а не обновлении. Как мне скучно решать проблему с помощью AutoMapper
, мне нужно стабильное исправление для решения проблемы без AutoMapper
. Не могли бы вы разъяснить мне, как решить эту проблему? Я передаю StudentViewModel
к методу обновления в контроллере, а затем мне нужно сопоставить его со студентом, а затем передать их в UserManager.Update()
метод as ApplicationUser
. С другой стороны, мне интересно, должен ли я получить и отправить пароль на этапе контроллера вместо того, чтобы переходить к просмотру для обеспечения безопасности? Не могли бы вы также сообщить мне об этой проблеме (во время обновления пользователя я не обновляю пароль, и я должен сохранить пароль пользователя в база данных.) Любая помощь будет оценена.
Классы Сущностей:
public class ApplicationUser : IdentityUser<int, ApplicationUserLogin,
ApplicationUserRole, ApplicationUserClaim>, IUser<int>
{
public string Name { get; set; }
public string Surname { get; set; }
//code omitted for brevity
}
public class Student: ApplicationUser
{
public int? Number { get; set; }
}
:
[HttpPost]
[ValidateAntiForgeryToken]
public JsonResult Update([Bind(Exclude = null)] StudentViewModel model)
{
if (ModelState.IsValid)
{
ApplicationUser user = UserManager.FindById(model.Id);
user = new Student
{
Name = model.Name,
Surname = model.Surname,
UserName = model.UserName,
Email = model.Email,
PhoneNumber = model.PhoneNumber,
Number = model.Number, //custom property
PasswordHash = checkUser.PasswordHash
};
UserManager.Update(user);
}
}
2 ответов
нет необходимости проходить student
as ApplicationUser
до UserManager.Update()
метод (потому что Student
класс наследует (отсюда и) ApplicationUser
).
проблема с вашим кодом заключается в том, что вы используете new Student
оператор, тем самым создавая нового студента, а не обновляя существующий.
измените код следующим образом:
// Get the existing student from the db
var user = (Student)UserManager.FindById(model.Id);
// Update it with the values from the view model
user.Name = model.Name;
user.Surname = model.Surname;
user.UserName = model.UserName;
user.Email = model.Email;
user.PhoneNumber = model.PhoneNumber;
user.Number = model.Number; //custom property
user.PasswordHash = checkUser.PasswordHash;
// Apply the changes if any to the db
UserManager.Update(user);
мой ответ на .netcore 1
эта работа для меня, я надеюсь, может помочь им
var user = await _userManager.FindByIdAsync(applicationUser.Id);
user.ChargeID = applicationUser.ChargeID;
user.CenterID = applicationUser.CenterID;
user.Name = applicationUser.Name;
var result = await _userManager.UpdateAsync(user);