您好我有关于模型绑定的问题。想象一下,您在表单中显示了一个现有的数据库实体,并且您想要编辑一些细节,某些属性(例如createddate等)未绑定到表单,在模型绑定期间,这些属性未分配给模型,因为它们不在http post数据或querystrong等,因此它们的属性为null。在我的控制器更新方法中,我只想做
公共ActionResult更新(实体) { //保存对db的更改 }
但由于某些属性在ent中为null,它们会覆盖不属于表单发布数据的现有数据库字段,处理此问题的正确方法是什么?我已尝试隐藏字段来保存数据,但模型绑定似乎没有为模型分配隐藏字段。任何建议将不胜感激
答案 0 :(得分:1)
您不应该将您的实体发送到您的视图,您应该发送一个名为DTO(数据传输对象)或ViewModel的超薄版本。
仅将属性发送到您希望用户使用该操作更新的视图(以及返回的表单)。
然后,您可以在POST处理程序中验证并将属性复制到您的实体。
如果您有很多属性,AutoMapper可以提供帮助
类似的东西:
public class User
{
int id;
string name;
string email;
}
public class EditUserEmailDto
{
string email;
}
// get
public ActionResult EditEmail(int id,)
{
return View("EditEmail", new EditUserEmailDto());
}
// post
public ActionResult EditEmail(int id, EditUserEmailDto dto)
{
if(!ModelState.IsValid)
return View("EditEmail", dto);
var user = userRepo.Get(id);
user.email = dto.email;
userRepo.Save(user);
return;
}