我觉得这应该是一件很普通的事情。我有一个带有相关对象的模型。假设它是一个用户,而一个用户只有一个角色。
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 */
}
}
我现在可能只是手动进行操作,但似乎至少在某种程度上我应该可以开箱即用。
您的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);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句