3

我正在开发一个MVC3项目,我注意到当记录从UI更新时,数据库中的某些字段被设置为null。发生这种情况是因为这些字段不在表单上。我知道这可以通过为这些添加HiddenFor项来解决,但这不是一个好方法,因为任何新字段都需要添加到那里。我希望找出一个更好的解决方案。MVC3数据丢失时不在表单上发布?

的项目是如何构成的一个小的阐述:

我们有匹配的EF实体正好简化测绘的DTO。所以DTO具有存在于实体&数据库中的每个字段。我们使用DTO作为我们的模型。

控制器将DTO传递给服务层。服务层将DTO映射到其相应的实体(使用AutoMapper),并将其传递到持久层。持久层是实际使用DbContext保存更改的内容。

假设我们有一个带有名称成员和FolderPath成员的Client DTO,并且只有名称成员在其表单上。表单帖子,并且该FolderPath为空。该值始终保留在持久层的更新中。我必须指出,我不希望那个特定的值覆盖数据库中的内容。

从我已经收集的SO研究这个了大约一个小时,一个方法可能是......

  1. 保持的DTO最小范围,针对特定的一组,我们 知道我们的领域将在一个视图中的形式。
  2. 告诉AutoMapper忽略 任何存在于目标而不是源per this answer.
  3. 在服务层,映射DTO到 实体时,首先从数据库检索现有的实体。映射 将只覆盖作为DTO的一部分的成员, ,并且任何其他值将从数据库检索 以来将保留。

这是一个有效的方法吗?有没有更好或更常见的方法来解决这个问题?

回答

2

我会选择1并具有视图/ html格式特定的模型。这是最干净的解决方案,恕我直言。

还有一个主要问题是,其他方式会让你打开黑客攻击......也就是说,如果我知道模型上的其他字段/属性,我可以使用该信息制作一个表单文章并将其保存。

+0

我的意思是把数字当作一个解决方案的步骤而不是独特的选择,因为我认为它们对实体中的所有成员都是必要的,但对DTO来说却是不可能存在的。此外,这是一个仅限少数人使用的仅限Intranet的应用程序,因此黑客问题不是太重要。 – 2012-08-08 16:24:14