如何在 Web Api 2.0 ApiController 中无限嵌套循环

问题描述 投票:0回答:1

我被困在最后,在 Get 或 Post 方法正文中找到 Web Api 2.0(请求和响应)的代码。 有人可以帮我解决这个问题吗? 我想在Postman中基于Request Body制作Body Json循环。

尚未连接到数据库,我只想先为 Postman 创建模板代码。

  1. 这是我的 APIcontroller 代码 =
using System.Collections.Generic;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using ABC.Models;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace ABC.Controllers
{
    public class Hitung6Controller : ApiController
    {
    [HttpPost]
        public HttpResponseMessage Post([FromBody]Hitung7Model minta1)
        {
            var req1 = minta1.DistributorCode;
            var hasil1 = new List<Hitung7Model>();
            var hasil2 = new List<Hitung8Model>();

            if (req1 != null)
            {
                hasil1.Add(new Hitung7Model()
                {
                    rowNested1 = hasil2
                    
                });

                hasil2.Add(new Hitung8Model()
                {
                });
            }
        return Request.CreateResponse(HttpStatusCode.OK, minta1);
        }

  1. 这里是我的代码模型=

using System.Collections.Generic;
using System.Linq;
using System.Web;
using Newtonsoft.Json;

namespace ABC.Models
{
    public class Hitung7Model
    {
        public string DistributorCode { get; set; }
        public List<Hitung8Model> rowNested1 { get; set; }
    }

    public class Hitung8Model
    {
        public string ProductCode2 { get; set; }
    }
}

我尝试像这样输入多对多读取请求(ProductCode2), 但只返回 1 (ProductCode2) image1

在邮递员中我输入=

{
    "DistributorCode" : "Abc",
     "rowNested1": [
         {
          "ProductCode2" : "A1",
          "ProductCode2" : "A2"
         }
     ]
}

但是返回响应是这样的=

{
    "DistributorCode": "Abc",
    "rowNested1": [
        {
            "ProductCode2": "A2"
        }
    ]
}

我尝试像这样读取请求正文,但我在 Postman 中收到错误,在 APiController 类中收到错误 也得到空引用。 image2-Read Request

我还想返回无限/无限循环(ProductCode2),例如我输入“Read Request”。 在邮递员读取请求中: [ProductCode2 = "A1"] 直到 [ProductCode2 = "A100"] 100 行 ProductCode2。 我需要返回响应嵌套循环与读取请求完全相同。 在邮递员返回响应中: [ProductCode2 = "A1"] 循环直到 [ProductCode2 = "A100"] 100 行 ProductCode2。

我输入邮递员读取请求,得到错误和空引用。

{
    "DistributorCode": "Abcd",
    "rowNested1": [
        {
            "ProductCode2": "A1"
        }
    ]
    "rowNested1": [
        {
            "ProductCode2": "A2"
        }
    ]
     "rowNested1": [
        {
            "ProductCode2": "A3"
        }
    ]
}

我需要返回与读取请求相同的响应结构,无限嵌套循环(“ProductCode2”)。 image3-return Response

{
    "DistributorCode": "Abcd",
    "rowNested1": [
        {
            "ProductCode2": "A1"
        }
    ]
    "rowNested1": [
        {
            "ProductCode2": "A2"
        }
    ]
     "rowNested1": [
        {
            "ProductCode2": "A3"
        }
    ]
}

请有人尝试帮助我解决我的问题, 谢谢大家的帮助。

c# api postman asp.net-web-api2 nested-loops
1个回答
0
投票

看起来这里有几个问题:

  1. 正确设置请求正文的格式。
  2. 从控制器中的请求中获取信息。

让我们首先处理请求正文,您的模型显示您有一个

Hitung7Model
,其中包含
Hitung8Model
对象列表作为单个字段,称为
rowNested1
。你会想要这样的东西:

{
    "DistributorCode" : "Abc",
    "rowNested1": [
        {
            "ProductCode2" : "A1"
        },
        {
            "ProductCode2" : "A2"
        }
    ]
}

现在对于您的控制器,您将拥有一个

Hitung7Model
实例和一个
Hitung8Model
列表。

[HttpPost]
public HttpResponseMessage Post([FromBody]Hitung7Model minta1)
{
    var req1 = minta1.DistributorCode;
    // I've left out hasil1 as it's the same as minta1
    var hasil2 = minta1.rowNested1; // This contains the list of Hitung8Model objects, if you want the string values extracted you can use the following line
    var productCode2s = minta1.rowNested1.Select(row => row.ProductCode2).ToList();

    return Request.CreateResponse(HttpStatusCode.OK, minta1);
}

此外,如果您的

Hitung8Model
仅包含单个字符串值,也许根本不需要它,您可以在
Hitung7Model
上有一个字符串列表,因此如下:

public class Hitung7Model
{
    public string DistributorCode { get; set; }
    public List<string> ProductCodes { get; set; }
}

这意味着您可以使用以下请求正文:

{
    "DistributorCode" : "Abc",
    "ProductCodes": [
        "A1",
        "A2"
    ]
}

并相应地简化控制器,即您不再需要

Select(...)
子句来获取产品代码,而只需使用
var productCodes = minta1.ProductCodes;

© www.soinside.com 2019 - 2024. All rights reserved.