1.数据库有40个字段
2.通过代码生成器生成了一个更新数据的方法UpdateData(Model model)[通过主键更新每个字段]
3.视图有10个字段提供给用户输入    用户提交数据到控制器Update(Model model)方法,此方法接受Model对象。
现在问题来了:
           如果要使用更新的数据的方法UpdateData,如何去封装这个Model实体?因为视图只提供了10个字段给控制器。           现在能想到的解决方案:           1.重写一个更新数据的方法,此方法只更新这10个字段。问题解决,但如果视图再增加1个字段,那么又要增加一个方法。
           2.通过反射将MVC封装好的model一对一把值赋给从数据取出来封装好的实体。问题:没办法知道那些属性是视图传入的。除非手写这些值,回到下3解决方案。
           3.通过数据库取值封装实体再编码一对一给需要更新的属性赋值。问题:相对麻烦,增加字段要重新编码。
想问问你们有没有其它解决方案。感谢MVC

解决方案 »

  1.   

    4.还有一种方法,把不需要更新的字段使用hidden隐藏起来。似乎不够安全,需要写的也比较多。
    求解决方案。
      

  2.   

    重新定义一个实体 只需要的十个字段   这概念叫视图模型
    用于Controller和View之间用的~Controller和数据库之间的 这概念叫可以说领域模型(但还差点点)
      

  3.   

    这种方式使用过。需要新建一个视图MODEL。这个model字段与视图字段保持一致。使用AutoMapper进行映射。
      

  4.   

    <input name="字段名字,一定要一致" >然后在后台就可以貌似有个TryModel的填充方法,
    但这样就需要自己后台验证了,
    所以我还是觉得自己定义
    ViewModel
    {
         [xxx]
         [yyy]
         public string Name{get;set;}
    }
    不用自己再写if...来判断传进来的值是否合法,刚刚搜到一篇
    http://msdn.microsoft.com/zh-cn/magazine/hh781022.aspx
      

  5.   


        [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 是白名单的方式
      

  6.   

    其实楼主你可以用EF的,然后UPDATE的时候只要在实体类中赋值你的10个字段值就可以了。
    在更新的时候可以选择只更新变更的数据即可。
      

  7.   

    前提:更新数据的方法UpdateData(Model model)[通过主键更新每个字段]更新时,先查询该条记录,得到一个对象实体,再给需要更新的字段赋值啊,不就解决了。ADO一个实体(40个字段),MVC的model(10个字段属性),将需要更新属性赋值给ADO对象更新!