J'utilise ASP.NET Identity 2
Dans un projet MVC 5
Et je souhaite mettre à jour les données Student
en utilisant la méthode UserManager.Update()
. Cependant, comme j'hérite de la classe ApplicationUser
, j'ai besoin de mapper Student
à ApplicationUser
avant d'appeler la méthode de mise à jour. D'un autre côté, lors de l'utilisation de l'approche que j'ai également utilisée pour créer un nouvel étudiant, il y a une erreur due à la simultanéité lorsque je crée une nouvelle instance plutôt que de la mettre à jour. Comme je m'ennuie pour résoudre le problème en utilisant AutoMapper
, j'ai besoin d'une solution stable pour résoudre le problème sans AutoMapper
. Pourriez-vous me préciser comment résoudre ce problème? Je passe le StudentViewModel
à la méthode de mise à jour dans le contrôleur, puis je dois le mapper à Student, puis les passer à la méthode UserManager.Update()
en tant que ApplicationUser
. D'un autre côté, je me demande si je devrais récupérer et envoyer le mot de passe sur le contrôleur au lieu de le transmettre à View pour des raisons de sécurité? Pourriez-vous également m'informer de ce problème (lors de la mise à jour utilisateur, je ne mets pas à jour le mot de passe et je dois conserver le mot de passe de l'utilisateur dans la base de données). Toute aide serait appréciée.
Classes d'entité:
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; }
}
Contrôleur:
[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);
}
}
Il n'est pas nécessaire de passer la student
comme ApplicationUser
à la méthode UserManager.Update()
(car la classe Student
hérite (d'où is ) ApplicationUser
).
Le problème avec votre code est que vous utilisez new Student
, créant ainsi un nouvel étudiant plutôt que de mettre à jour l'existant.
Modifiez le code comme ceci:
// 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);
ma réponse sur .netcore 1
ce travail pour moi, j'espère peut les aider
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);