传入List <keyvaluepair <string,string>&gt;到WebAPI得到我的空值

时间:2017-02-01 16:10:40

标签: javascript c# json list asp.net-web-api

我正在尝试将包含其中的KeyValuePair对象列表的对象列表以及一些其他属性传递给WebAPI。但是,当我使用像Rest Console这样的东西发送JSON时(或者甚至只是通过Javascript的AJAX调用),对象列表填充正常,它是List&gt;获取正确数量的对象,但值始终为null。

这是我用来调试它的代码。

我创建了一个WebApi方法来给我一个MyModel项列表,所以我可以看到JSON是如何创建它们的。

performBackgroundTask

这让我回到了以下JSON:

    [HttpPost]
    public JsonResult GetSavedItemsJson(int accountId)
    {
        var tmpItem = new List<MyModel>();
        tmpItem.Add( new MyModel
        {
            ItemType = "Item1",
            MinCount = 3000,
            MaxCount = 5000,
            KeyValuePairs = new List<KeyValuePair<string, string>>
            {
                new KeyValuePair<string, string>("MinItems", "3.0"),
                new KeyValuePair<string, string>("MaxItems", "11.0")
            }
        });
        tmpItem.Add(new MyModel
        {
            ItemType = "Item2",
            MinCount = 1500,
            MaxCount = 2500,
            KeyValuePairs = new List<KeyValuePair<string, string>>
            {
                new KeyValuePair<string, string>("PaymentMin", "150"),
                new KeyValuePair<string, string>("PaymentMax", "500")
            }
        });
        var result = new JsonResult
        {
            MaxJsonLength = int.MaxValue,
            Data = tmpItem
        };
        return result;
    }

我尝试添加其他属性并将项目列表设为数组。

[
  {
  "ItemType ":"Item1",
  "KeyValuePairs":[
     {
        "Key":"MinItems",
        "Value":"3.0"
     },
     {
        "Key":"MaxItems",
        "Value":"11.0"
     }
  ],
  "MinCount ":3000,
  "MaxCount ":5000
 },
 {
  "ItemType ":"Item2",
  "KeyValuePairs":[
     {
        "Key":"PaymentMin",
        "Value":"150"
     },
     {
        "Key":"PaymentMax",
        "Value":"500"
     }
  ],
  "MinCount ":1500,
  "MaxCount ":2500
   }
]

我的accountId,ItemName和userId数字很好。我还获得了包含MinCount,MaxCount和ItemType值的List项。只是KeyValuePairs列表为每个对象提供了2个项目,但值为null。

以上值我使用REST Console将值发送到WebApi。

如果它有所不同,我使用这个javascript来创建对象。它给了我完全相同的结果。

{
 "itemName":"MyTestItem",
 "accountId":54321,
 "userId":12345,
 "itemModels":[
  {
     "ItemType":"Item1",
     "KeyValuePairs":[
        {
           "Key":"MinItems",
           "Value":"3.0"
        },
        {
           "Key":"MinItems",
           "Value":"11.0"
        }
     ],
     "MinCount":3000,
     "MaxCount":5000
  },
  {
     "ItemType":"Item2",
     "KeyValuePairs":[
        {
           "Key":"PaymentMin",
           "Value":"150"
        },
        {
           "Key":"PaymentMax",
           "Value":"500"
        }
     ],
     "MinCount":1500,
     "MaxCount":2500
  }
 ]
}

我一定做错了,但在堆栈溢出或其他任何网站上找不到合适的答案时都会遇到问题。

1 个答案:

答案 0 :(得分:1)

我在这里做了这个测试并且它有效!查看我的RequestTest对象。

public class RequestTest
{
    public string ItemType { get; set; }
    public List<KeyValuePair<string,string>> KeyValuePairs { get; set; }
}

[HttpPost]
[ActionName("Test")]
[Route("api/TestInfo/Test")]
public IHttpActionResult Test([FromBody]RequestTest requestTest)
{
    Debug.WriteLine(requestTest.ItemType);
    Debug.WriteLine(requestTest.KeyValuePairs.First().Key);
    Debug.WriteLine(requestTest.KeyValuePairs.First().Value);

    return Ok();
}



function saveItem() {
    debugger;

    var properties = new Array();
    properties.push({ "Key": "MaxItems", "Value": "3.0" });
    properties.push({ "Key": "MinItems", "Value": "11.0" });

    var requestTest = {};
    requestTest.ItemType = "ItemString";
    requestTest.KeyValuePairs = properties;

    $.ajax({
        method: "POST",
        url: apiURL + '/TestInfo/Test',
        data: requestTest,
        dataType: "json",
        success: function (data) {
            console.log("Data: " + data);
        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            console.log("Status: " + textStatus);
            console.log("Error: " + errorThrown);
        }
    });
}   

enter image description here