web-dev-qa-db-fra.com

Mise à jour de l'utilisateur par UserManager.Update () dans ASP.NET Identity 2

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);
    }
}
14
Jack

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);
39
Ivan Stoev

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);
2
Nilton Alvarez