web-dev-qa-db-de.com

Aktualisieren des Benutzers mit UserManager.Update () in ASP.NET Identity 2

Ich verwende ASP.NET Identity 2 In einem MVC 5 - Projekt und möchte Student Daten mit der UserManager.Update() Methode aktualisieren. Da ich jedoch von der Klasse ApplicationUser erbe, muss ich Student auf ApplicationUser abbilden, bevor ich die Aktualisierungsmethode aufrufe. Auf der anderen Seite tritt bei der Verwendung des Ansatzes, den ich auch zum Erstellen eines neuen Schülers verwendet habe, ein Fehler auf, da beim Erstellen einer neuen Instanz und nicht beim Aktualisieren gleichzeitig ein Fehler auftritt. Da es mir langweilig ist, das Problem mit AutoMapper zu lösen, benötige ich eine stabile Lösung, um das Problem ohne AutoMapper zu lösen. Können Sie mir bitte erklären, wie ich dieses Problem lösen kann? Ich übergebe das StudentViewModel an die Update-Methode im Controller und muss es dann Student zuordnen und sie dann an die UserManager.Update()-Methode als ApplicationUser übergeben. Andererseits frage ich mich, ob ich das Kennwort auf der Controller-Bühne abrufen und senden soll, anstatt es aus Sicherheitsgründen an View weiterzuleiten. Könnten Sie mich auch über dieses Problem informieren (während der Benutzeraktualisierung aktualisiere ich kein Kennwort und muss das Kennwort des Benutzers in der Datenbank behalten). Jede Hilfe wäre dankbar.

Anteilsklassen:

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; }
}


Controller:

[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

Es ist nicht erforderlich, student als ApplicationUser an die UserManager.Update() -Methode zu übergeben (da die Student -Klasse erbt (daher ist) ) ApplicationUser).

Das Problem mit Ihrem Code ist, dass Sie den Operator new Student Verwenden und somit einen neuen Schüler erstellen, anstatt den vorhandenen zu aktualisieren.

Ändern Sie den Code wie folgt:

// 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

meine antwort auf .netcore 1

diese Arbeit für meine, ich hoffe, kann ihnen helfen

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