NET Core - FromForm 发布的嵌套对象未作为普通列表发送到微服务
Posted
技术标签:
【中文标题】NET Core - FromForm 发布的嵌套对象未作为普通列表发送到微服务【英文标题】:NET Core - FromForm posted Nested Object is not being sent to the Microservice as a normal List 【发布时间】:2021-09-19 02:46:42 【问题描述】:所以,在我的控制器中,我有这个
public async Task<IActionResult> ExpenseSubmission([FromForm] myModel request)
预计信息将通过 FrontEnd 从表单发送,这正在发生,我正在接收所有信息。
这是前端代码中列表的附加部分:
formdata.append("expense.procList[0].StringA", "asd");
formdata.append("expense.procList[0].StringB", "Consulta SNS");
formdata.append("expense.procList[0].StringC", "20");
formdata.append("expense.procList[0].StringD", "310");
formdata.append("expense.procList[0].StringE", "2020-10-13");
这个模型收到一个运行良好的列表,我得到了信息,问题是,当我将列表发送到我需要与之通信的 WebService 时,它给了我这个错误:
Message = "Cannot deserialize the current JSON object (e.g. \"name\":\"value\") into type 'System.Collections.Generic.IList`1[ADV.Service.Client.IreneWS.Models.ErrorResponse]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.\r\nTo fix...
但是每当我更改为[FromBody]
时,它都不会给我这个问题...
我的列表只是像数组一样工作还是我在这里缺少的东西?
前端代码,是不是有什么问题?
【问题讨论】:
FromForm 使用表单应用格式... FromBody 使用 JSON 您好,请问还有什么可以帮助您的吗? 【参考方案1】:您似乎正在尝试将您的表单数据POST
发送到您的Asp.net Core
控制器并收到Json
解析错误。
您收到此错误是因为您的FromForm
格式不正确,正如您在Microsoft Official Docs 中看到的那样。
由于官方文档中没有给出示例,所以我在FromForm
和FromBody
上都附上了两个示例
FromForm 示例:
Client Side Example:
h2>From From </h2>
@section scripts
<script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.2.1.min.js"></script>
<script>
$(document).ready(function ()
$("button").click(function (e)
data = new FormData();
data.append("MpnID", 5);
data.append("PartnerName", "Leandro Batista");
$.ajax("https://localhost:44346/api/ConnectUs/FromFormExample",
method: "post",
processData: false,
// contentType: false,
contentType: "application /x-www-url-formencoded",
data: data,
success: function (data)
console.log(data);
$("#MpnID").text(data.mpnID);
$("#PartnerName").text(data.partnerName);
);
);
);
</script>
<table class="table table-sm table-bordered table-striped">
<tr><th>MpnID:</th><td id="MpnID"></td></tr>
<tr><th>PartnerName:</th><td id="PartnerName"></td></tr>
</table>
<button class="btn btn-primary">Submit</button>
注意:如果是
FromForm
contentType
应该是contentType: false
和 数据绑定格式应该是这样的data.append("MpnID", 5); data.append("PartnerName", "Leandro Batista")
Backend Example:
[HttpPost]
[Route("FromFormExample")]
[ActionName("FromFormExample")]
public ActionResult<RequestMode> FromFormExample([FromForm]RequestMode model)
return model;
FromBody 示例:
Client Side Example:
<h2>From Body</h2>
@section scripts
<script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.2.1.min.js"></script>
<script>
$(document).ready(function ()
$("button").click(function (e)
$.ajax("https://localhost:44346/api/ConnectUs/FromBodyExample",
method: "post",
contentType: "application/json",
crossDomain: true,
data: JSON.stringify(
MpnID: 5,
PartnerName: "Leandro Batista"
),
success: function (data)
console.log(data);
$("#MpnID").text(data.mpnID);
$("#PartnerName").text(data.partnerName);
);
);
);
</script>
<table class="table table-sm table-bordered table-striped">
<tr><th>MpnID:</th><td id="MpnID"></td></tr>
<tr><th>PartnerName:</th><td id="PartnerName"></td></tr>
</table>
<button class="btn btn-primary">Submit</button>
注意:这里你应该记住数据应该是
JSON.stringify
格式,内容类型应该是contentType: "application/json"
Backend Example:
[HttpPost]
[Route("FromBodyExample")]
[ActionName("FromBodyExample")]
public ActionResult<RequestModel> FromBodyExample([FromBody]RequestModel model)
return model;
输出:
希望这会减少混乱。如果您还有任何问题,请随时告诉我。
【讨论】:
这不是我问的问题,我说当我从表单接收它后将它发送到 web 服务时它不起作用,完全不同。我可以将它发布到我的控制器,问题是当它从我的控制器到另一个服务时。 感谢您的反馈,在这种情况下,您需要Serialize
,因为FormData
将数据保存在键值对中。我试图向您展示两种格式。如果您需要任何进一步的帮助,请告诉我。
是的,我序列化了我的模型,但它不起作用。我不知道网络服务是否需要更改以获取 FormData 请求或类似的东西
请您在序列化的地方分享您的代码 sn-p。这样我就可以重现该问题。以上是关于NET Core - FromForm 发布的嵌套对象未作为普通列表发送到微服务的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ASP.NET Web API 5.2.3 中使用 FromForm 属性