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 中看到的那样。

由于官方文档中没有给出示例,所以我在FromFormFromBody 上都附上了两个示例

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 属性

Fromform

.net core 1.1 中的嵌套包含

使用 entityFramework Automapper .Net Core 的嵌套映射

NET CORE MVC - 如何使用嵌套的多参数路由

嵌套对象的 ASP.NET CORE Hot Chocolate 查询错误