В приложении .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
я могу конечно, код мой Create
метод в MyController
для анализа запроса (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
}
В этот момент I не может определить, какие поля должны быть NULLED в 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