在.netcore應用程序,我想提供以下(簡化):.NetCore MVC反序列化
// 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
方法來解析提交的值的請求(querystring/form/body),並相應地創建我的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反序列化(以優雅的方式)?
不要將持久性模型用作控制器操作的返回值或輸入值。它尖叫着出現故障 – Tseng