我有一个复杂的模型类,其中只能编辑几个字符串列(并且可以编辑)。当我打开并编辑其中几列并保存表单时,字符串列会很好地回发,但其他(数组)列为空 - 这会将保存分解为实体框架。
使用MVC3和EF进行此操作的正确方法是什么?
答案 0 :(得分:2)
从数据库加载模型,然后调用TryUpdateModel(yourDbLoadedModel)将表单中的值合并到模型中。如果您只想在表单中包含一些特定字段,也可以指定要在此绑定中包含或排除的字段 - 建议这样做,以便有人不能通过注入不打算存在的表单字段来破解您的模型作为主键值。
答案 1 :(得分:1)
我认为这是一个常见问题。我使用了几种方法:
1)这是我推荐的方法。使用仅包含要编辑的属性的viewmodel。然后可以按照您当前尝试的方式直接绑定。这种方法的问题是您需要从EF对象复制属性。如果命名一致,您可以使用哑反射复印机。如果它们不是,或者您需要使用图形来复制它们,那么我倾向于最终将该自定义逻辑放入viewmodel类中。 (这使得它不仅仅是一个纯粹的视图模型 - 但除了视图模型和视图之外,其他任何东西都需要知道它的存在。)
2)使用修改后的绑定。你可以指定[Bind(Exclude =“this,that,theother”)]来阻止某些属性被清空,当属性是你根本不想在屏幕上显示的标量属性时,使用Html.HiddenFor(x => x.myprop)
另一种方法是
3)自定义粘合剂。您可以注册自己的自定义活页夹并根据需要设计工程师。这不是我用过的方法。但可能效果很好。
原因1)是比2)更好的方法(恕我直言)是2)通过HTML POST暴露整个模型以进行更新。 MVC绑定器将更改绑定到适合的任何内容,因此精心设计的POST可以执行一些意想不到的事情:遍历您不打算公开和更新属性的关系。另一方面,Viewmodel模式需要具有仅公开用户与之交互的字段的实体,因此可以安全地绑定。
答案 2 :(得分:0)
您可以将只读列绑定到隐藏字段,以便从回发中获得的模型将完整,但这可能是一个安全问题,具体取决于您选择隐藏其他列的原因