当我PUT到我的控制器进行更新时,我可以使用如下代码来确保只更新对象中指定的那些属性。换句话说,如果我有一个带有属性ID,X,Y和Z的ControlLinePointDto对象,则以下只会更新属性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}}]的对象,并反序列化它 - 然后按照aboce使用我的代码,但这开始变得相当复杂。还有更好的方法吗?
答案 0 :(得分:1)
我能提出的最佳解决方案是将请求作为JArray而不是List来读取。然后我可以递归并获取每个对象的ID。从数据库中获取对象,然后使用PopulateObject更新相关属性。看起来像这样;
>>> import sys
>>> print(sys.maxunicode)
1114111