編集保存フォームに応答するための標準で生成されたコードブロック
[HttpPost]
public ActionResult Edit(User user)
{
if (ModelState.IsValid)
{
db.Entry(user).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(user);
}
すべてのフィールドが編集ビューに存在する場合に機能します。
私のモデルには、(明らかな理由で)非表示のフォームフィールドとして渡したくないパスワードフィールドがあります。その結果、パスワードはnullになります(これは予想されることです)。このシナリオを処理するには、どのようにコーディングする必要がありますか?
パスワード値を取得します。データベースから値を取得する必要がありますか?使用する場合:User u = db.User.Find(user.ID); EFには、「同じキーを持つオブジェクトがObjectStateManagerにすでに存在する」という問題があります。
偽であるため、ModelState.IsValidに取り組むにはどうすればよいですか。
以前のMVCバージョンの回答を見つけましたが、これを達成するための最もエレガントで効率的な方法は何でしょうか?
@ freeride、確かにuser.Passwordがnullかどうかをテストする必要はありません。nullであると予想し、そうでない場合は、悪意のあるユーザーによって挿入されました。全体の演習は、ユーザーによるパスワードの操作を回避することでした。
パスワードフィールド(ModelState.Remove( "Password");)を削除すると、ModelState検証の問題は解決します。今は問題が残っていますが、パスワード値を復元するにはどうすればよいですか?以下の作品:
[HttpPost]
public ActionResult Edit(user user)
{
user v = db.Users.Find(user.ID);
ModelState.Remove("Pass");
user.Password = v.Password; // assign from db
if (ModelState.IsValid)
{
//db.Entry(user).State = EntityState.Modified; // this won't work as the context changed
db.Entry(v).CurrentValues.SetValues(user); // we need to use this now
db.SaveChanges();
return RedirectToAction("Index");
}
return View(user);
}
値を取得するために追加のdbトリップを実行する必要があるのでしょうか。EFコンテキストの変更を修正するためにコードを変更する必要がありましたが、機能しますが、コードは正しいですか?