C# Angular 8将formData发布到ASP.NET核心API无法绑定IEnumerable/List
正如标题所说 类型脚本模型C# Angular 8将formData发布到ASP.NET核心API无法绑定IEnumerable/List,c#,angular,typescript,asp.net-core,angular8,C#,Angular,Typescript,Asp.net Core,Angular8,正如标题所说 类型脚本模型 export interface RigheOrdiniBuoniSpesaData { id: number; id_ordine: number; id_taglio_buono_spesa: number; quantita: number; } 这是另一个更大物体的一部分: export class OrdiniBuoniSpesaData { id: number; // OTHER FIELD // OTHER FIELD
export interface RigheOrdiniBuoniSpesaData {
id: number;
id_ordine: number;
id_taglio_buono_spesa: number;
quantita: number;
}
这是另一个更大物体的一部分:
export class OrdiniBuoniSpesaData {
id: number;
// OTHER FIELD
// OTHER FIELD
// OTHER FIELD
righe_ordine: RigheOrdiniBuoniSpesaTableData;
}
保存方法
saveOrder(model: OrdiniBuoniSpesaData) {
const headerPost: HttpHeaders = new HttpHeaders();
headerPost.set('Content-type', 'application/x-www-form-urlencoded');
const formData: FormData = new FormData();
formData.append('id_cliente', model.id_cliente.toString());
// VARIOUS FORM FIELDS
//THIS IS ARRAY DATA
formData.append('righe_ordine', JSON.stringify(model.righe_ordine));
return this.http
.post<boolean>(
requestURL,
formData,
{ headers: headerPost }
)
.pipe(
catchError(this.handleError)
);
}
在API方面
JSON的接收模型
public class RigheOrdiniBuoniSpesaViewModel
{
public long id { get; set; }
public long id_ordine { get; set; }
public long id_taglio_buono_spesa { get; set; }
public int quantita { get; set; }
}
哪个在
public class OrdiniBuoniSpesaViewModel
{
public long id { get; set; }
//OTHER VARIOUS FIELDS
//I TRIED ALSO WITH LIST INSTEAD OF IENUMERABLE
public IEnumerable<RigheOrdiniBuoniSpesaViewModel> righe_ordine {get;set;}
}
存在并正确填充了。。。。。但由于某种原因,将其绑定到OrdinibounispesaviewModel失败了
我做错了什么?有什么想法吗
编辑:
目前,我找到的唯一解决方案是在进入控制器后直接捕获值:
string righeJson = this.Request.Form["righe_ordine"].ToString();
if(!string.IsNullOrEmpty(righeJson))
model.righe_ordine = JsonConvert.DeserializeObject<IEnumerable<RigheOrdiniBuoniSpesaViewModel>>(righeJson);
string righeJson=this.Request.Form[“righe_ordine”].ToString();
如果(!string.IsNullOrEmpty(righeJson))
model.righe_ordine=JsonConvert.DeserializeObject(righeJson);
我认为您需要像这样更改型号名称
private readonly IJsonParseService<RigheOrdiniBuoniSpesaViewModel> _jsonParsePostOptionDefaultVm;
jsonParsePostOptionDefaultVm.ToObject(viewModel.RigheOrdiniBuoniSpesaViewModel);
在js代码中
formData.append('righeOrdine', JSON.stringify(model.righe_ordine));
和c#
公共类OrdinibounispesaviewModel
{
公共长id{get;set;}
//其他各领域
//我还尝试使用LIST而不是IENUMERABLE
公共IEnumerable RigheOrdine{get;set;}
}
更新:只是为了增强
在控制器中使用它之前,可能需要对其进行解析
你可以阅读我的全部代码
我们需要创建接口和类来实现它
public interface IJsonParseService<T> where T : class
{
T ToObject(string json);
}
public class JsonParseService<T> : IJsonParseService<T> where T : class
{
public T ToObject(string json)
{
return JObject.Parse(json).Root.ToObject<T>();
}
}
公共接口IJsonParseService,其中T:class
{
T ToObject(字符串json);
}
公共类JsonParseService:IJsonParseService其中T:class
{
公共T对象(字符串json)
{
返回JObject.Parse(json.Root.ToObject();
}
}
然后注册
services.AddScoped(typeof(IJsonParseService<>), typeof(JsonParseService<>));
services.AddScoped(typeof(IJsonParseService)、typeof(JsonParseService));
所以你的代码应该是这样的
private readonly IJsonParseService<RigheOrdiniBuoniSpesaViewModel> _jsonParsePostOptionDefaultVm;
jsonParsePostOptionDefaultVm.ToObject(viewModel.RigheOrdiniBuoniSpesaViewModel);
private只读IJsonParseService\u jsonParsePostOptionDefaultVm;
jsonParsePostOptionDefaultVm.ToObject(viewModel.RigheOrdiniBuoniSpesaViewModel);
我认为您需要像这样更改型号名称
private readonly IJsonParseService<RigheOrdiniBuoniSpesaViewModel> _jsonParsePostOptionDefaultVm;
jsonParsePostOptionDefaultVm.ToObject(viewModel.RigheOrdiniBuoniSpesaViewModel);
在js代码中
formData.append('righeOrdine', JSON.stringify(model.righe_ordine));
和c#
公共类OrdinibounispesaviewModel
{
公共长id{get;set;}
//其他各领域
//我还尝试使用LIST而不是IENUMERABLE
公共IEnumerable RigheOrdine{get;set;}
}
更新:只是为了增强
在控制器中使用它之前,可能需要对其进行解析
你可以阅读我的全部代码
我们需要创建接口和类来实现它
public interface IJsonParseService<T> where T : class
{
T ToObject(string json);
}
public class JsonParseService<T> : IJsonParseService<T> where T : class
{
public T ToObject(string json)
{
return JObject.Parse(json).Root.ToObject<T>();
}
}
公共接口IJsonParseService,其中T:class
{
T ToObject(字符串json);
}
公共类JsonParseService:IJsonParseService其中T:class
{
公共T对象(字符串json)
{
返回JObject.Parse(json.Root.ToObject();
}
}
然后注册
services.AddScoped(typeof(IJsonParseService<>), typeof(JsonParseService<>));
services.AddScoped(typeof(IJsonParseService)、typeof(JsonParseService));
所以你的代码应该是这样的
private readonly IJsonParseService<RigheOrdiniBuoniSpesaViewModel> _jsonParsePostOptionDefaultVm;
jsonParsePostOptionDefaultVm.ToObject(viewModel.RigheOrdiniBuoniSpesaViewModel);
private只读IJsonParseService\u jsonParsePostOptionDefaultVm;
jsonParsePostOptionDefaultVm.ToObject(viewModel.RigheOrdiniBuoniSpesaViewModel);
在其他项目中,我正确解析了IEnumerables,如果必须这样做,那么我当前的解决方法就足够了。谢谢尼哥,你确定吗?仅供参考,我的模型中的其他字段有:public long id_cliente{get;set;}public long id_modalita_pagamento{get;set;}等等,到目前为止,它们对下划线的命名约定没有问题。我尝试了新的解决方案,但没有改变,仍然没有结果,在我正确解析IEnumerables的其他项目中,如果我必须这样做,那么我当前的工作环境就足够了。谢谢尼哥,你确定吗?仅供参考,我的模型中的其他字段有:public long id_cliente{get;set;}public long id_modalita_pagamento{get;set;}等等,到目前为止,它们对下划线的命名约定没有问题。我尝试了新的解决方案,但没有任何更改,仍然没有结果,我必须手动执行