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