В первом примере идентификатор заполняет идентификатор модели из маршрута, а не имя.Вот почему он проходит проверку плохого запроса, и имя будет очищено, поскольку оно не было заполнено.
Во втором примере вы отправляете тело, которое не содержит 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