0

これはかなり一般的なことだと思います。関連オブジェクトを持つモデルがあります。それがユーザーであり、ユーザーが 1 つの役割を持っているとしましょう。

public class User
{
  public int Id { get; set; }
  public virtual Role Role { get; set; }
  /* other stuff that saves fine */
}

public class Role
{
  public int Id {get;set;}
  public string Name { get;set;}
}

したがって、新しいユーザーを保存したり、ユーザーを編集したりしても (ただし、ロールは変更しないでください)、問題はありません。ロールのないユーザーがいて、そのユーザーにロールを追加しても問題ありません (ただし、手動でロールを検索して割り当てます)。ロールを変更しようとすると、Role プロパティで、ID がオブジェクトのキーの一部であり、変更できないというモデル状態エラーが発生します。では、人々はどのようにしてこのような更新を行っているのでしょうか? 単純な値をホワイトリストに登録してから、ロールを手動で更新しますか?

問題のコントローラーコードは次のとおりです。

[HttpPost]
public ActionResult Save(int id, FormCollection form)
{
   var user = data.Users.FirstOrDefault(d=> d.Id == id);

   if (user != null)
   {
      TryUpdateModel(user, form.ToValueProvider());
      if (!ModelState.IsValid)
      {
         var messages = ModelState.Values.Where(m => m.Errors.Count() > 0).SelectMany(m=>m.Errors).Select(e => e.ErrorMessage);
         if (Request.IsAjaxRequest())
              return Json(new { message = "Error!", errors = messages });
         return RedirectToAction("index"); // TODO: more robust Flash messaging
      }

      updateDependencies(user);
     /* negotiate response */
   }
}

おそらく今のところ手動で行うだけですが、少なくともある程度は、箱から出してすぐに動作することを期待していたシナリオのようです。

4

1 に答える 1

2

モデルUserには外部キーが必要です。

public int? RoleId { get; set; }
public virtual Role Role { get; set; }

Role.Idこの値に を割り当てるかnull、ユーザーがロールを持っていないときに作成できます。

あなたのSave機能が正しいかどうかもわかりません。私は常にこのパターンを使用しています (それが正しいかどうかもわかりません...) が、もちろん、サーバーに投稿するデータに依存します:

[HttpPost]    
public ActionResult Save(User model)
{
  if (ModelState.IsValid)
  {
    // Save logic here, for updating an existing entry it is something like:
    context.Entry(model).State = EntityState.Modified;
    context.SaveChanges();
    return View("Success");
  }
  return View("Edit", model);
}
于 2013-11-14T09:52:53.440 に答える