1.数据库有40个字段
2.通过代码生成器生成了一个更新数据的方法UpdateData(Model model)[通过主键更新每个字段]
3.视图有10个字段提供给用户输入 用户提交数据到控制器Update(Model model)方法,此方法接受Model对象。
现在问题来了:
如果要使用更新的数据的方法UpdateData,如何去封装这个Model实体?因为视图只提供了10个字段给控制器。 现在能想到的解决方案: 1.重写一个更新数据的方法,此方法只更新这10个字段。问题解决,但如果视图再增加1个字段,那么又要增加一个方法。
2.通过反射将MVC封装好的model一对一把值赋给从数据取出来封装好的实体。问题:没办法知道那些属性是视图传入的。除非手写这些值,回到下3解决方案。
3.通过数据库取值封装实体再编码一对一给需要更新的属性赋值。问题:相对麻烦,增加字段要重新编码。
想问问你们有没有其它解决方案。感谢MVC
2.通过代码生成器生成了一个更新数据的方法UpdateData(Model model)[通过主键更新每个字段]
3.视图有10个字段提供给用户输入 用户提交数据到控制器Update(Model model)方法,此方法接受Model对象。
现在问题来了:
如果要使用更新的数据的方法UpdateData,如何去封装这个Model实体?因为视图只提供了10个字段给控制器。 现在能想到的解决方案: 1.重写一个更新数据的方法,此方法只更新这10个字段。问题解决,但如果视图再增加1个字段,那么又要增加一个方法。
2.通过反射将MVC封装好的model一对一把值赋给从数据取出来封装好的实体。问题:没办法知道那些属性是视图传入的。除非手写这些值,回到下3解决方案。
3.通过数据库取值封装实体再编码一对一给需要更新的属性赋值。问题:相对麻烦,增加字段要重新编码。
想问问你们有没有其它解决方案。感谢MVC
求解决方案。
用于Controller和View之间用的~Controller和数据库之间的 这概念叫可以说领域模型(但还差点点)
但这样就需要自己后台验证了,
所以我还是觉得自己定义
ViewModel
{
[xxx]
[yyy]
public string Name{get;set;}
}
不用自己再写if...来判断传进来的值是否合法,刚刚搜到一篇
http://msdn.microsoft.com/zh-cn/magazine/hh781022.aspx
[Bind(Include="Name,Sex,Phone")] //只允许Name,Sex,Phone由用户输入更新
public class DataModel
{
public int ID { get; set; }
public string Name { get; set; }
public string Sex { get; set; }
public string Phone { get; set; }
public string EMail { get; set; }
}
直接使用 Bind属性,Include 是白名单的方式
在更新的时候可以选择只更新变更的数据即可。