我觉得这应该是一件很常见的事情。我有一个带有相关对象的模型。假设它是一个用户,一个用户有一个角色。
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 */
}
}
我现在可能只是手动完成,但这似乎是我希望开箱即用的场景,至少在某种程度上是这样。