0

編集保存フォームに応答するための標準で生成されたコードブロック

[HttpPost]
public ActionResult Edit(User user)
{
  if (ModelState.IsValid)
  {
    db.Entry(user).State = EntityState.Modified;
    db.SaveChanges();
    return RedirectToAction("Index");
  }
 return View(user);
}

すべてのフィールドが編集ビューに存在する場合に機能します。

私のモデルには、(明らかな理由で)非表示のフォームフィールドとして渡したくないパスワードフィールドがあります。その結果、パスワードはnullになります(これは予想されることです)。このシナリオを処理するには、どのようにコーディングする必要がありますか?

  1. パスワード値を取得します。データベースから値を取得する必要がありますか?使用する場合:User u = db.User.Find(user.ID); EFには、「同じキーを持つオブジェクトがObjectStateManagerにすでに存在する」という問題があります。

  2. 偽であるため、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コンテキストの変更を修正するためにコードを変更する必要がありましたが、機能しますが、コードは正しいですか?

4

1 に答える 1

2

if (ModelState.IsValid)

追加

if (string.IsNullOrEmpty(user.Password))
{
    ModelState.Remove("Password");
}

値を取得するために余分な db トリップを行う義務があるのだろうか? EF コンテキストの変更を修正するためにコードを変更する必要がありましたが、動作しますが、コードは正しいですか?

別の方法でそれを行います。エンティティ オブジェクトをモデルとして使用しないでください。更新が必要なデータのみを含むモデルを作成します。次に例を示します。

public class UserModel
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string Surname { get; set; }
}

そしていま:

[HttpPost]
public ActionResult Edit(UserModel userModel)
{

    if (ModelState.IsValid)
    {
        User user = db.Users.Find(userModel.Id);
        user.FirstName = userModel.FirstName ;
        user.Surname  = userModel.Surname;
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(userModel);
}

お役に立てば幸いです。

于 2012-07-14T18:35:49.437 に答える