.Net Core контроллер для обновления массива, но только с включенными свойствами
Когда я помещаю свой контроллер для обновления, я могу использовать код, подобный следующему, чтобы гарантировать, что обновляются только те свойства, которые указаны в объекте. Другими словами, если бы у меня был объект ControlLinePointDto со свойствами ID, X, Y и Z, следующее будет только обновлять свойство X
JSON
{
"key" : 5,
"values" : {
"X": 1234
}
}
контроллер
[HttpPut]
public async Task<IActionResult> PutControlLinePoint(int key, string values)
{
if (!ModelState.IsValid) return BadRequest(ModelState);
int id = key;
ControlLinePoint controlLinePoint = _context.ControlLinePoint.First(x => x.ControlLinePointId == key);
JsonConvert.PopulateObject(values, controlLinePoint);
if (id != controlLinePoint.ControlLinePointId) return BadRequest();
_context.Entry(controlLinePoint).State = EntityState.Modified;
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!ControlLinePointExists(id)) return NotFound();
else throw;
}
return NoContent();
}
Теперь я хочу сделать то же самое для массива контрольных точек. Я мог бы создать объект, который был бы просто [{"key":5, "values":{"X": 1234}}], и десериализовать его - затем использовать мой код в каждом случае, но это начинает становиться довольно сложным. Есть ли способ лучше?
1 ответ
Лучшее решение, которое я мог придумать, включает чтение запроса как JArray, а не List. Затем я могу получить и получить идентификатор для каждого объекта. Получите объект из базы данных и PopulateObject, чтобы просто обновить соответствующие свойства. Выглядит примерно так;
[HttpPut("UpdateControlLinePointSet")]
public async Task<IActionResult> UpdateControlLinePointSet([FromBody] JArray pointSetJson)
{
if (!ModelState.IsValid) return BadRequest(ModelState);
foreach (JToken p in pointSetJson)
{
ControlLinePoint clp = _context.ControlLinePoint.First(x => x.ControlLinePointId == (int)p["ControlLinePointId"]);
JsonConvert.PopulateObject(p.ToString(), clp);
_context.Entry(clp).State = EntityState.Modified;
}
await _context.SaveChangesAsync();
return NoContent();
}