【发布时间】:2017-01-25 02:50:48
【问题描述】:
在 .netcore 应用程序中,我想提供以下(简化):
// Create a new record, assume it returns an ID=1
https://site/MyController/Save?FirstName=John&LastName=Doe&Status=Active
// Update the record without full state
PUT https://site/MyController/1
{
'DOB': '1/1/1970',
'Status': null
}
我想将第二次通话翻译为:
UPDATE MyModel SET DOB = '1/1/1970' AND Status=NULL WHERE Id = 1
我当然可以在MyController 中编写我的Create 方法来解析提交值的请求(查询字符串/表单/正文),并相应地创建我的SQL。
但是,我更愿意遵循 MVC 约定并利用 MVC 提供的开箱即用的绑定:
public async Task<MyModel> Save(string id, [FromBody]MyModel instance)
{
await _MyRepository.UpdateAsync(id, message);
return message;
}
这里的问题是实例看起来像这样:
{
'FirstName': null,
'LastName': null,
'DOB': '1/1/1970',
'Status': null
}
此时我无法确定 Db 中哪些字段应为空,哪些字段应保留。
我已经实现了一个包装类:
- 在反序列化时,设置任何“脏”属性,并且
- 在序列化时,只写入脏属性
这会稍微改变我的方法签名,但不会给开发人员带来负担:
public async Task<MyModel> Save(string id, [FromBody]MyWrapper<MyModel> wrapper
{
await _MyRepository.UpdateAsync(id, wrapper.Instance, wrapper.DirtyProperties);
return wrapper.Instance;
}
我的两个问题是:
- 我是在重新发明一种既定模式吗?
- 我可以拦截 MVC 反序列化(以优雅的方式)吗?
【问题讨论】:
-
不要使用持久性模型作为控制器操作的返回值或输入值。它为麻烦而尖叫
标签: c# asp.net-core json.net asp.net-core-mvc