- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我的 MVC 应用程序中有一个 View ,其中公开了我的实体的一些(但不是全部)属性以供编辑。还有其他不向用户公开的实体属性。现在,表单以我的实体类型的参数形式发布到我的 Controller 。该实体具有在 View 中公开的字段的有效值,但其余未公开的字段为空。如果我转到我的存储库并尝试用这个更新现有实体,许多字段将被空值覆盖。
我如何仅使用用户在 View 中更改的字段来更新我的实体?
我可以想到两种方法。还有吗?
您将模型的所有字段作为隐藏字段包含在表单中。这样,当发布时,整个模型都会更新。
您只发布用户可以更改的字段,并且您有特定的路由、 Controller 方法和存储库方法来处理这种方法。您可以使用 updateEntityAddress 之类的方法,在其中接收新的地址值,然后它们会覆盖现有值。您知道此方法仅用于更新特定类型的字段,因此您知道哪些已更改,并且可以编写代码来仅更新这些字段。
最佳答案
正如 Stephen Muecke 在评论中提到的,您需要借鉴“ViewModel”的概念。我并不是说您需要一个真正成熟的 ViewModel,因为您已经声明您在做 MVC,而不是在做 MVVM,但这些概念是相关的,因为 MVVM 派生自 MVC。
因此,您需要清楚地了解实体的哪些子集向 View 公开(并可由 View 编辑),以便您知道原始实体的哪些部分需要更新以及哪些部分必须保留为“as-是”。
一个快速而肮脏的解决方案可能是:
但更好的方法是:
引入一大堆新类,每个实体一个,每个类:
从长远来看,拥有一组单独的 ViewModel 类是值得的,因为您不可避免地会发现,您的模型实体有时无法以其原始形式呈现给用户,也无法由用户编辑,但它们需要在用户看到它们之前进行转换,并且这些转换可能需要在更改可以持久化之前被逆转。也就是说,用户看到的表单不需要(不应该限于)与模型实体一一对应。
关于c# - 如何在不知道更新了哪些字段的情况下处理更新实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34215165/
我是一名优秀的程序员,十分优秀!