c# - Angular 8 post formData 到 ASP.NET Core API 无法绑定 IEnumerable/List
问题描述
正如标题所说
打字稿模型
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)
);
}
订单 json(有效的 Json)与所有数据一起在 Chrome 请求捕获中清晰可见:
[{"id":0,"id_ordine":0,"id_taglio_buono_spesa":1,"quantita":1},{"id":0,"id_ordine":0,"id_taglio_buono_spesa":1,"quantita":1},{"id":0,"id_ordine":0,"id_taglio_buono_spesa":1,"quantita":1},{"id":0,"id_ordine":0,"id_taglio_buono_spesa":3,"quantita":14}]
在 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;}
}
(我也尝试使用列表而不是 IENUMERABLE,但仍然没有运气!)
API 控制器签名:
[HttpPost]
public async Task<IActionResult> PostSaveOrder([FromForm] OrdiniBuoniSpesaViewModel model)
{.....code}
除 righe_ordine 数组外,所有字段均已正确绑定!我可以正确看到每个字段,但数组的计数 = 0。
奇怪的是,如果我在 Visual Studio 的 QuickWatch 调试中检查 asp 网络请求对象(this.Request.Form):
this.Request.Form["righe_ordine"]
{[{"id":0,"id_ordine":0,"id_taglio_buono_spesa":1,"quantita":1},
{"id":0,"id_ordine":0,"id_taglio_buono_spesa":1,"quantita":1},
{"id":0,"id_ordine":0,"id_taglio_buono_spesa":1,"quantita":1},
{"id":0,"id_ordine":0,"id_taglio_buono_spesa":3,"quantita":14}]}
Microsoft.Extensions.Primitives.StringValues
存在并正确填充.....但由于某种原因将其绑定到 OrdiniBuoniSpesaViewModel 失败....
我究竟做错了什么?任何想法?
编辑:
目前我找到的唯一解决方案是在进入控制器后直接捕获值:
string righeJson = this.Request.Form["righe_ordine"].ToString();
if(!string.IsNullOrEmpty(righeJson))
model.righe_ordine = JsonConvert.DeserializeObject<IEnumerable<RigheOrdiniBuoniSpesaViewModel>>(righeJson);
解决方案
我认为您需要像这样更改模型名称
在你的 js 代码中
formData.append('righeOrdine', JSON.stringify(model.righe_ordine));
和 c#
public class OrdiniBuoniSpesaViewModel
{
public long id { get; set; }
//OTHER VARIOUS FIELDS
//I TRIED ALSO WITH LIST INSTEAD OF IENUMERABLE
public IEnumerable<RigheOrdiniBuoniSpesaViewModel> 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>();
}
}
然后注册
services.AddScoped(typeof(IJsonParseService<>), typeof(JsonParseService<>));
所以你的代码应该是这样的
private readonly IJsonParseService<RigheOrdiniBuoniSpesaViewModel> _jsonParsePostOptionDefaultVm;
jsonParsePostOptionDefaultVm.ToObject(viewModel.RigheOrdiniBuoniSpesaViewModel);
推荐阅读
- java - 使用 Mockito 进行单元测试时的空指针
- visual-studio-code - Visual Studio Code - 复制和粘贴大的东西时某些功能不起作用
- amazon-web-services - Kubernetes 无法从 eks pod 访问 rds mysql
- visual-studio - `
` Visual Studio 中 Intellisense 中的标记 - ide - IDE 显示条件始终为假
- python - 如何使用正则表达式在python中的单词周围添加引号?
- xcode - 将 charls 合并到 MacOS 应用程序中
- javascript - 在 DRAG 上跟随 div 的 arcgis-JS 折线路径
- html - 刚开始研究python,想问一下美汤
- java - 多线程:更改对象的输出与预期不符