【问题标题】:Post multiple bodies to web api controller将多个主体发布到 Web api 控制器
【发布时间】:2019-05-15 14:45:59
【问题描述】:

我有一个角度服务,它有一个 post 方法,我需要将数据从两个不同的主体发送到 asp.net 核心控制器。第一个 bodie 包含来自 EventListener 的数据,第二个包含一个 id: number。

首先我有一个方法,它接受两个值并将它们发送到 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
    }

我需要如何在 Angular 服务中格式化发布请求,以便将值正确插入模型中?

【问题讨论】:

  • 如果不够明确,JSON.stringify 将给定参数字符串化。这意味着您正在发送一个字符串,而不是 JSON。如果要获取值,不应该将其保留为 JSON 吗?
  • 试试var returndata = {...body, ...body2};
  • 既然 areayId 在你的模型中,为什么不把它添加到body

标签: c# angular asp.net-core dapper


【解决方案1】:

您的控制器需要一个 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)));
}

【讨论】:

    猜你喜欢
    • 2015-05-03
    • 2019-03-26
    • 1970-01-01
    • 2014-11-26
    • 2019-03-24
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    • 2019-08-26
    相关资源
    最近更新 更多