2010-05-18 88 views
0

嗨我有一个关于模型绑定的问题。假设你有一个现有的数据库实体显示在一个表单中,并且你想编辑一些细节,一些属性例如createddate等没有绑定到表单,在模型绑定过程中,这些属性没有分配给模型,因为它们没有http post数据或querystrong等,因此它们的属性为空。在我的更新控制器的方法,标识只是喜欢做在更新实体场景中的asp.net mvc自定义模型绑定

公众的ActionResult更新(实体耳鼻喉科) {// 将更改保存到数据库 }

但有些性能是耳鼻喉科空,它们将覆盖现有数据库字段不是表单发布数据的一部分,处理此问题的正确方法是什么?我曾尝试使用隐藏字段来保存数据,但模型绑定似乎并未将隐藏字段分配给模型。任何建议,将不胜感激

回答

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

这是有道理的安德鲁,感谢您的回复。我认为你的解决方案在一个简单的情况下工作,当你使用自定义模型联编程序时,既适用于保存和更新方案,也需要将值分配给类型而不是viewdata。你将如何处理? – mctayl 2010-05-18 21:10:34

+0

而且你会如何利用模型验证等功能? – mctayl 2010-05-18 21:20:15

+0

重新评论:不知道我明白你的意思,你能解释一下这个问题吗?重新第二评论,我做我的验证在活页夹,这样它使邮政处理程序整洁。不适当更新答案以显示处理程序的示例,但验证位在这里可能会过度。基本上,我扩展了'DefaultModelBinder',重写'BindModel',调用'base.BindModel',然后从我的IoC容器中为模型类型获取验证器,验证模型,然后在ModelState中粘贴任何错误 – 2010-05-19 09:14:50