使用MVC3保存复杂模型的更新

本文关键字:更新 模型 复杂 MVC3 保存 使用 | 更新日期: 2023-09-27 18:01:06

我有一个复杂的模型类,其中只有少数字符串列应该(并且可以(编辑。当我打开和编辑其中的几个列并保存表单时,字符串列会被很好地发布回来,但其他(数组(列为null——这会中断保存到实体框架。

使用MVC3和EF的正确方法是什么?

使用MVC3保存复杂模型的更新

从数据库加载模型,然后调用TryUpdateModel(yourDbLoadedModel(将表单中的值合并到模型中。如果您只想在表单中包括几个特定的字段,您也可以指定要在此绑定中包括或排除的字段-建议这样做,这样就不会有人通过注入不打算存在的表单字段(如主键值(来破解您的模型。

我认为这是一个常见的问题。我使用了几种方法:

1( 这是我推荐的方法。使用仅包含要编辑的特性的视图模型。然后可以像您当前尝试的那样直接绑定回。这种方法的问题是,您需要将属性从EF对象复制到EF对象。如果命名一致,您可以使用哑反射复印机。如果它们不是,或者你需要遍历一个图来将它们复制回来,那么我最终倾向于将自定义逻辑放入视图模型类中。(这使它不仅仅是一个纯视图模型,但除了视图模型和视图之外,什么都不需要知道它的存在。(

2( 使用修改后的绑定。您可以指定[Bind(Exclude="this,that,theother"(]来阻止某些属性为null,当这些属性是您根本不想在屏幕上显示的标量属性时,请使用Html.HidFor(x=>x.myprop(

另一种方法是

3( 自定义装订。您可以注册自己的自定义活页夹,并根据需要进行设计。这不是我用过的方法。但可能效果良好。

1(是比2((IMHO(更好的方法的原因是2(通过HTMLPOST公开整个模型以进行更新。MVC绑定器将更改绑定到任何适合的内容,因此精心设计的POST可以做一些意想不到的事情:遍历您不打算公开的关系并更新属性。另一方面,Viewmodel模式需要具有只公开用户交互的字段的实体,以便可以安全地绑定到。

您可以将只读列绑定到隐藏字段,以便从post-back中获得的模型将是完整的,尽管这可能是一个安全问题,具体取决于您为什么选择隐藏其他列

相关文章: