更新实体场景中的asp.net mvc自定义模型绑定

时间:2010-05-18 19:45:19

标签: asp.net asp.net-mvc

您好我有关于模型绑定的问题。想象一下,您在表单中显示了一个现有的数据库实体,并且您想要编辑一些细节,某些属性(例如createddate等)未绑定到表单,在模型绑定期间,这些属性未分配给模型,因为它们不在http post数据或querystrong等,因此它们的属性为null。在我的控制器更新方法中,我只想做

公共ActionResult更新(实体)     { //保存对db的更改 }

但由于某些属性在ent中为null,它们会覆盖不属于表单发布数据的现有数据库字段,处理此问题的正确方法是什么?我已尝试隐藏字段来保存数据,但模型绑定似乎没有为模型分配隐藏字段。任何建议将不胜感激

1 个答案:

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