gpt4 book ai didi

c# - 如何在不知道更新了哪些字段的情况下处理更新实体?

转载 作者:太空宇宙 更新时间:2023-11-03 12:55:01 27 4
gpt4 key购买 nike

我的 MVC 应用程序中有一个 View ,其中公开了我的实体的一些(但不是全部)属性以供编辑。还有其他不向用户公开的实体属性。现在,表单以我的实体类型的参数形式发布到我的 Controller 。该实体具有在 View 中公开的字段的有效值,但其余未公开的字段为空。如果我转到我的存储库并尝试用这个更新现有实体,许多字段将被空值覆盖。

我如何仅使用用户在 View 中更改的字段来更新我的实体?

我可以想到两种方法。还有吗?

  1. 您将模型的所有字段作为隐藏字段包含在表单中。这样,当发布时,整个模型都会更新。

  2. 您只发布用户可以更改的字段,并且您有特定的路由、 Controller 方法和存储库方法来处理这种方法。您可以使用 updateEntityAddress 之类的方法,在其中接收新的地址值,然后它们会覆盖现有值。您知道此方法仅用于更新特定类型的字段,因此您知道哪些已更改,并且可以编写代码来仅更新这些字段。

最佳答案

正如 Stephen Muecke 在评论中提到的,您需要借鉴“ViewModel”的概念。我并不是说您需要一个真正成熟的 ViewModel,因为您已经声明您在做 MVC,而不是在做 MVVM,但这些概念是相关的,因为 MVVM 派生自 MVC。

因此,您需要清楚地了解实体的哪些子集向 View 公开(并可由 View 编辑),以便您知道原始实体的哪些部分需要更新以及哪些部分必须保留为“as-是”。

一个快速而肮脏的解决方案可能是:

  • 在某个地方有一个表(可能是一个将每个实体类型映射到字段名称列表的字典),它列出了一个实体的哪些字段将被发送到 View ,因此哪些字段应该被接收回来,以及应用于实体。

但更好的方法是:

  • 引入一大堆新类,每个实体一个,每个类:

    • 填充了构成实体的字段的子集
    • 发送到 View 并呈现给用户
    • 在 POST 请求中收到。
    • 然后应用于原始实体。

从长远来看,拥有一组单独的 ViewModel 类是值得的,因为您不可避免地会发现,您的模型实体有时无法以其原始形式呈现给用户,也无法由用户编辑,但它们需要在用户看到它们之前进行转换,并且这些转换可能需要在更改可以持久化之前被逆转。也就是说,用户看到的表单不需要(不应该限于)与模型实体一一对应。

关于c# - 如何在不知道更新了哪些字段的情况下处理更新实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34215165/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com