3

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

关于项目结构的一些详细说明:

我们有与 EF 实体完全匹配的 DTO,以简化映射。因此,DTO 的每个字段都存在于实体和数据库中。我们使用 DTO 作为我们的模型。

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

假设我们有一个带有 Name 成员和 FolderPath 成员的 Client DTO,以及一个在其表单上只有 Name 成员的视图。表单发布,并且该 FolderPath 为空。该空值一直持续到持久层中的更新。在某个地方,我必须指定我不希望该特定值覆盖数据库中的内容。

从我收集的关于 SO 的研究中收集了大约一个小时,一种方法可能是......

  1. 对于我们知道我们将在视图中的表单上拥有的一组特定字段,保持 DTO 的范围最小。
  2. 根据此答案,告诉 AutoMapper 忽略目标中存在的任何内容,但不忽略源中存在的任何内容。
  3. 在服务层,在将 DTO 映射到实体时,首先从数据库中检索现有的实体。映射只会覆盖属于 DTO 的成员,并且任何其他值都将保留,因为它们是从数据库中检索的。

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

4

1 回答 1

2

我会选择选项 1 并查看/html 表单特定模型。这是最干净的解决方案,恕我直言。

还有一个主要问题是其他方式让您对黑客攻击持开放态度......即,如果我知道您模型上的其他字段/属性,我可以使用该信息制作一个表单帖子并将其保存。

于 2012-08-08T16:15:03.307 回答