.Net Core控制器更新数组,但仅包含属性

时间:2018-06-14 08:07:04

标签: asp.net-core-webapi

当我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使用我的代码,但这开始变得相当复杂。还有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

我能提出的最佳解决方案是将请求作为JArray而不是List来读取。然后我可以递归并获取每个对象的ID。从数据库中获取对象,然后使用PopulateObject更新相关属性。看起来像这样;

>>> import sys
>>> print(sys.maxunicode)
1114111