Опубликовать несколько тел на веб-контроллер API - PullRequest
0 голосов
/ 15 мая 2019

У меня есть служба angular, в которой есть метод post, в котором мне нужно отправлять данные из двух разных тел в основной контроллер asp.net. Первый боди содержит данные из EventListener, а второй содержит id: номер.

Сначала у меня есть метод, который принимает оба значения и отправляет их в метод createResoure.

  getData(areaid: any) {
    window.addEventListener("message", (e) => {
      let data = JSON.parse(e.data);
      console.log(data, {areaid: areaid});
      this.createResource(data, areaid).subscribe(data => this.resources.push(data, areaid));
      }, false);
  }

и вот у меня есть метод post.

  createResource(resource: Resource, id: any): Observable<Resource> 
  {
    let body = JSON.stringify(resource)
    let body2 = JSON.stringify({areaid: id});
    var returndata = {body, body2}
    console.log({returndata})
    return this.httpclient.post<Resource>(this.endpoint + '/resource/insertresource', returndata, this.httpOptions)
     .pipe(catchError(this.handleError('addResource', resource))
     );
    }

Когда я регистрирую это тело, оно выглядит так:

returndata:
body: "{"id":282213,"title":"page 1","description":"","thumbnail":"https://site/image/resourcethumbnail?guid=ec9a136d-8ae6-47dd-ab79-14fd47a4f300","url":"https://site/l/show.html#yr7ER"}"
body2: "{"areaid":20}"

Но когда я получаю значения в свой контроллер, каждое значение становится нулевым.

public IEnumerable<Resource> InsertResource(Resource resource)
{
    using(var connection = new SqlConnection(connectionString))
    {
        var query = ($@"INSERT INTO [dbo].[Resource]([Id], [Title], [Thumbnailurl], [ViewUrl], [Description], [AreaId]) 
                                 VALUES (@Id, @title, @Thumbnail, @Url, @Description, @areaid);");

        var getById = connection.Query<Resource>(query, new {resource.Id, resource.Title, resource.Thumbnail, resource.Url, resource.Description, resource.AreaId});
        return getById;
    }
}

Модель:

 public class Resource
    {
        [Key]
        public int ResourceId { get; set; }
        public int Id { get; set; }
        public string Title { get; set; }
        public string Thumbnail { get; set; }
        public string Url { get; set; }
        public string Description { get; set; }
        public int AreaId { get; set; } //foreign key
    }

Как мне нужно отформатировать почтовый запрос в угловой службе, чтобы значения были вставлены прямо в модель?

Ответы [ 2 ]

0 голосов
/ 15 мая 2019

Ваш контроллер ожидает объект Resource, но ваш POST-запрос выглядит примерно так:

{
  body: "{\"id\": 123, \"title\": \"xyz\", ...}",
  body2: "{\"areaid\":20}"
}

Во-первых, вы можете удалить JSON.stringify, поскольку Angular будет кодировать объекты JavaScript для вас.

Во-вторых, вы можете использовать оператор распространения (...) для объединения нескольких объектов в один, например,

createResource(resource: Resource, id: any): Observable<Resource> 
{
  const returndata = {areaid: id, ...resource};
  console.log(returndata);
  return this.httpclient.post<Resource>(this.endpoint + '/resource/insertresource', returndata, this.httpOptions)
   .pipe(catchError(this.handleError('addResource', resource)));
}
0 голосов
/ 15 мая 2019

В угловом коде вы должны создать подобный объект

let body = JSON.stringify(resource)
let body2 = JSON.stringify({areaid: id});
let resource = {
  body,
  body2
}

Итак, в вашей модели ресурсов вам нужно определить такую ​​модель

 public class Resource
    {
       public object body {get;set;}
       public object body2 {get;set;}
    }

Таким образом, вам нужно будет создать 2 объекта body и body2 для сопоставления с отправкой модели из угла, и вам нужно создать 2 класса body и body для хранения необходимых вам данных

Пожалуйста, дайте мне знать, если вам что-то непонятно

...