_ASP.NET Identity 2
_プロジェクトで_MVC 5
_を使用しており、UserManager.Update()
メソッドを使用してStudent
データを更新します。ただし、ApplicationUser
クラスから継承するため、updateメソッドを呼び出す前にStudent
をApplicationUser
にマッピングする必要があります。一方、新しい生徒の作成にも使用したアプローチを使用すると、更新ではなく新しいインスタンスを作成する際の同時実行によるエラーが発生します。 AutoMapper
を使用して問題を解決することに退屈しているので、AutoMapper
なしで問題を解決するには安定した修正が必要です。この問題を解決する方法を教えてください。 StudentViewModel
をコントローラーのUpdateメソッドに渡し、それをStudentにマップしてから、ApplicationUser
としてUserManager.Update()
メソッドに渡す必要があります。一方、セキュリティ上の問題のためにViewに渡すのではなく、Controllerステージでパスワードを取得して送信する必要があるかどうか疑問に思っていますか?この問題についてもお知らせください(ユーザーの更新中はパスワードを更新せず、データベースにユーザーのパスワードを保持する必要があります)。任意の助けをいただければ幸いです。
エンティティクラス:
_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);
}
}
_
student
をApplicationUser
としてUserManager.Update()
メソッドに渡す必要はありません(Student
クラスが継承するため(したがってis)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);