ASP Core PatchDocument, возвращающий неверный ввод

Я хочу использовать JsonPatchDocument для обновления моделей, которые были изменены в Angular 6. К сожалению, я продолжаю получать ответ 400 Bad Request со следующим сообщением:

{"":["The input was not valid."]}

Теперь я не уверен, правильно ли я это делаю, но так настроен мой код:

Внешний интерфейс:

edit.ts class

onSubmit() {
    this.testService.update(this.id, this.prepareFormModel())
      .subscribe(res => console.info(res);
  }

  prepareFormModel() {
    const formModel = this.testForm.value;

    const retVal: any = {
      title: formModel.title as string,
      comment: formModel.comment ? formModel.comment : '' as string,
      qualified: formModel.qualified as boolean
    };

    return retVal;
  }

класс test.service.ts

constructor(private http: HttpClient) { }

  update(id: string, value: any): Observable<any> {
    return this.http.patch<any>('http://localhost:5001/api/test' + '/' + id, value);
  }

в моем контроллере проекта ASP CORE

    [HttpPatch("{id}")]
    public async Task<IActionResult> UpdateModel(Guid id, [FromBody]JsonPatchDocument<TestModel> modelDocument)
    {            
        return Ok();
    }

Модель DTO

    public class TestModel
    {
        public string Title { get; set; }
        public string Comment { get; set; }
        public bool Qualified { get; set; } 
    }

Любая идея относительно того, что я заполняю?

Обновление 1:

Я заметил, что патч httpclient отправляет только контент типа application/json. Глядя на некоторые примеры JsonPatchDocument, он, похоже, запрашивает тип application/json-patch+json.

1 ответ

Решение

Для вашего текущего кода, вы неправильно поняли JsonPatchDocument который используется для точного описания того, как вы хотите изменить документ (например, заменить значение в поле другим значением) без необходимости также отправлять оставшиеся неизмененные значения.

Вы проходите prepareFormModel вместо того, чтобы описывать, как вы хотите изменить formModel,

Если вы хотите получить TestModel прямо в UpdateModel нужно удалить JsonPatchDocument,

    public async Task<IActionResult> UpdateModelWithOutJsonPatch(Guid id, [FromBody]TestModel modelDocument)
    {
        return Ok();
    }

Если вы хотите реализовать JsonPatchDocument который описан в патче JSON. В ASP.net Core вам нужно передать описание документа, для библиотеки путей json вы можете попробовать fast-json-patch,

  • API

        public async Task<IActionResult> UpdateModelWithJsonPatch(Guid id, [FromBody]JsonPatchDocument<TestModel> modelDocument)
    {
        return Ok();
    }
    
  • установить пакет

      npm install fast-json-patch --save
    
  • импортировать функции

    import { compare } from 'fast-json-patch';
    
  • Сравните объекты и передавая eh jsonpatch объект.

export class FetchDataComponent {
  public forecasts: WeatherForecast[];
  constructor(http: HttpClient, @Inject('BASE_URL') baseUrl: string) {
    const patch = compare(this.previousFormModel(), this.prepareFormModel());
    http.patch<any>(baseUrl + 'api/SampleData/UpdateModelWithJsonPatch/1', patch).subscribe(result => {
      console.log(result);
    }, error => console.error(error));;

    http.patch<any>(baseUrl + 'api/SampleData/UpdateModelWithOutJsonPatch/1', this.prepareFormModel()).subscribe(result =>     {
      console.log(result);
    }, error => console.error(error));;

  }
  previousFormModel() {
    //const formModel = this.testForm.value;
    const retVal: any = {
      title: "t2" as string,
      comment: "c2" as string,
      qualified: false as boolean
    };
    return retVal;
  }
  prepareFormModel() {    //const formModel = this.testForm.value;

    const retVal: any = {
      title: "t1" as string,
      comment: "c1" as string,
      qualified: true as boolean
    };
    return retVal;
  }
}

Примечание для JsonPatch, вам нужно будет реализовать что-то вроде ниже, чтобы получить TestModel

[Route("api/[controller]")]
 public class PersonController : Controller
 {
private readonly Person _defaultPerson = new Person
{
    FirstName = "Jim",
    LastName = "Smith"
};

[HttpPatch("update")]
public Person Patch([FromBody]JsonPatchDocument<Person> personPatch)
{
    personPatch.ApplyTo(_defaultPerson);
    return _defaultPerson;
}
}
Другие вопросы по тегам