魔方WebApi版每个实体控制器都支持添删改查和批查接口,添加PUT和删除DELETE都很好实现,批查Search通过POST传入一批参数,也还好。唯独修改Edit,很难完美实现。

默认的Edit,入参是整个实体对象,客户端把整个修改后的对象传过来,进行整体修改。然而,很多时候我们不希望前端能够修改这个实体的所有字段,例如User类的RoleId字段,管理员可以改,用户自己却不允许改;或者某些字段在保存前需要处理,例如User类的Password字段,前端可能是明文或者加密过来,后端需要处理后再落库。归结起来就一点,后端怎么样知道前端要修改这个对象的哪些字段


方案

已知方法有以下几种:

  1. 整个对象序列化后上传。服务端通过差异对比知道修改了哪些字段,或者是字符串字段未赋值就认为没有修改。缺点是,无法清空字符串字段,也不好修改Enable字段。
  2. 独立对象上传,服务端接口用字典接收。客户端只序列化要修改的字段,服务端用字典来接收。这样子很容易知道哪些字段被修改了。但是前端(可能是桌面客户端)用起来很麻烦,每一种修改都得搞一个新对象,即使用匿名对象也得封装多个修改方法。而服务端接口使用字典,对于前后端对接很不友好!
  3. 整个对象序列化上传,额外增加一个数组记录已修改字段。这是结合了前面二者的优点,但是缺点也不少。


除了以上方法,你还有什么更好的方法吗?

结论

结果群里讨论,比较多同学选择服务端接口使用字典或者JsonElement来接收数据,客户端按需传递。

修改星尘,客户端服务端之间新增SetJob接口。

客户端封装SetJob,内部把它跟备份数据进行差异化对比。

网络抓包,确认传输内容达到预期。


服务端接收,先按照JobModel来完整接收,再从请求参数里面取得上传了哪些字段。


最后差异化对比更新