0

我觉得这应该是一件很常见的事情。我有一个带有相关对象的模型。假设它是一个用户,一个用户有一个角色。

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

您可以将 a 分配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 回答