ASP Core PatchDocument, возвращающий неверный ввод - PullRequest
0 голосов
/ 28 октября 2018

Я хочу использовать 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 class

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 Ответ

0 голосов
/ 29 октября 2018

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