代码之家  ›  专栏  ›  技术社区  ›  John Straka

MVC3数据在发布时丢失,而不是在表单上?

  •  3
  • John Straka  · 技术社区  · 12 年前

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

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

    我们有与EF实体完全匹配的DTO,以简化映射。因此DTO在实体&数据库我们使用DTO作为我们的模型。

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

    假设我们有一个具有Name成员和FolderPath成员的客户端DTO,并且视图的表单上只有Name成员。表单发布,而FolderPath为null。该null值一直持续到持久层中的更新。在此过程中,我必须指定不希望该特定值覆盖数据库中的内容。

    从我在SO上研究了大约一个小时的情况来看,一种方法可能是。。。

    1. 对于我们 知道我们会在一个视图上有一个窗体。
    2. 告诉AutoMapper忽略 目标中存在但源中不存在的任何内容 per this answer.
    3. 在服务层中,当将DTO映射到 实体,首先从数据库中检索现有实体。这个 映射将仅覆盖作为DTO的一部分的成员, 并且任何其他值都将持续存在,因为它们是从 数据库。

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

    1 回复  |  直到 7 年前
        1
  •  2
  •   Charlino    12 年前

    我会选择选项1,并拥有view/html表单特定的模型。这是最干净的解决方案,IMHO。

    还有一个主要问题是,其他方式让你容易受到黑客攻击。。。也就是说,如果我知道你模型上的其他字段/属性,我可以用这些信息制作一个表单并保存下来。