Простой способ ОБНОВИТЬ элемент, используя ASP .Net Core API контроллер и POSTMAN - PullRequest
0 голосов
/ 18 апреля 2019

С помощью этого простого способа использовать глагол PUT для обновления элемента с помощью ASP.Net Core 2.2 и Postman я создал модель следующим образом:

public class Product
{
    public Guid Id { get; set; }

    public string Name { get; set; }    
}

метод контроллера следующим образом:

// PUT: api/PutProduct/5
[HttpPut("api/[action]/{id}")]
public async Task<IActionResult> PutProduct(Guid id, Product Product)
{
    if (id != Product.Id)
    {
        return BadRequest();
    }

    _context.Entry(Product).State = EntityState.Modified;

    try
    {
        await _context.SaveChangesAsync();
    }
    catch (DbUpdateConcurrencyException)
    {
        if (!ProductExists(id))
        {
            return NotFound();
        }
        else
        {
            throw;
        }
    }

    // return NoContent();
    return AcceptedAtAction("GetProduct", new { id = Product.Id, name = Product.Name }, Product);
}

затем тело JSON следующим образом:

{
    "name": "Product (Edited)"
}

Теперь, когда я нажимаю на метод Postman PUT, он возвращает статус 202, но вместо обновления поля «имя» с новымзначение очищает его.

Если я добавлю [FromBody], как показано ниже, он возвращает 400 Ошибка (неправильный запрос):

public async Task<IActionResult> PutProduct(Guid id, [FromBody] Product Product)

Что я здесь не так делаю?

1 Ответ

4 голосов
/ 18 апреля 2019

В первом примере идентификатор заполняет идентификатор модели из маршрута, а не имя.Вот почему он проходит проверку плохого запроса, и имя будет очищено, поскольку оно не было заполнено.

Во втором примере вы отправляете тело, которое не содержит id, которое не проходит проверку проверки.

При использовании [FromBody] в этом случае вам нужно будет включить идентификатор вполезная нагрузка JSON.

{
    "id": "{Guid_here}",
    "name": "Product (Edited)"
}

в противном случае вам необходимо переосмыслить структуру / поток действия

. Вы должны проверить состояние модели данных с помощью ModelState.IsValid, чтобы убедиться, что онидопустимо.

Первое обновление модели с аннотациями данных

public class Product {
    [Required]
    public Guid Id { get; set; }
    [Required]
    public string Name { get; set; }    
}

И проверьте состояние в действии.

[HttpPut("api/[action]/{id}")]
public async Task<IActionResult> PutProduct(Guid id, [FromBody]Product Product) {

    if (id != Product.Id) {
        ModelState.AddModelError("Id", "Invalid Id");
    }

    if(!ModelState.IsValid) {
        return BadRequest(ModelState);
    }

    _context.Entry(Product).State = EntityState.Modified;

    try {
        await _context.SaveChangesAsync();
    } catch (DbUpdateConcurrencyException) {
        if (!ProductExists(id)) {
            return NotFound();
        } else {
            throw;
        }
    }

    return AcceptedAtAction("GetProduct", new { id = Product.Id, name = Product.Name }, Product);
}

Дополнительно вы можете обновить модель с аннотациями о том, гдедля привязки данных из.

Например

public class Product {
    [Required]
    [FromRoute] //<--
    public Guid Id { get; set; }
    [Required]
    public string Name { get; set; }    
}

Обратите внимание на добавленные атрибуты.

и отправьте исходную полезную нагрузку

{
    "name": "Product (Edited)"
}

Ссылка Связывание модели в ASP.NET Core

...