在更新实体场景中的asp.net mvc自定义模型绑定
问题描述:
嗨我有一个关于模型绑定的问题。假设你有一个现有的数据库实体显示在一个表单中,并且你想编辑一些细节,一些属性例如createddate等没有绑定到表单,在模型绑定过程中,这些属性没有分配给模型,因为它们没有http post数据或querystrong等,因此它们的属性为空。在我的更新控制器的方法,标识只是喜欢做在更新实体场景中的asp.net mvc自定义模型绑定
公众的ActionResult更新(实体耳鼻喉科) {// 将更改保存到数据库 }
但有些性能是耳鼻喉科空,它们将覆盖现有数据库字段不是表单发布数据的一部分,处理此问题的正确方法是什么?我曾尝试使用隐藏字段来保存数据,但模型绑定似乎并未将隐藏字段分配给模型。任何建议,将不胜感激
答
你不应该发送你的实体到你的观点,你应该发送它的瘦身版本称为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;
}
这是有道理的安德鲁,感谢您的回复。我认为你的解决方案在一个简单的情况下工作,当你使用自定义模型联编程序时,既适用于保存和更新方案,也需要将值分配给类型而不是viewdata。你将如何处理? – mctayl 2010-05-18 21:10:34
而且你会如何利用模型验证等功能? – mctayl 2010-05-18 21:20:15
重新评论:不知道我明白你的意思,你能解释一下这个问题吗?重新第二评论,我做我的验证在活页夹,这样它使邮政处理程序整洁。不适当更新答案以显示处理程序的示例,但验证位在这里可能会过度。基本上,我扩展了'DefaultModelBinder',重写'BindModel',调用'base.BindModel',然后从我的IoC容器中为模型类型获取验证器,验证模型,然后在ModelState中粘贴任何错误 – 2010-05-19 09:14:50