我有一个角度服务,它有一个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
}
我该如何在angular服务中格式化发布请求,以便将值正确插入模型中?
答案 0 :(得分:0)
在角度代码中,您应该创建一个像这样的对象
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,以与从angular提交的模型进行映射,并且需要创建2个class body和body来保存所需的数据
请让我知道您不清楚的事情
答案 1 :(得分:0)
您的控制器期望一个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)));
}