如何将表单数据发布到API控制器

时间:2016-03-24 17:25:42

标签: jquery asp.net asp.net-mvc asp.net-mvc-4 asp.net-web-api

使用jquery:

发布表单数据
$.ajax('API/Validate/Customer?column=1&rowid=2&vmnr=3&isik=4',
   {
       data: JSON.stringify({
           headerData: $("#_form").serializeArray()
       }),
       async: false,
       contentType: "application/json; charset=utf-8",
       dataType: "json",
       type: "POST"
   });

ASP.NET MVC4 Web API控制器验证:

public class ValidateController : ApiController
{
    public class Body
    {
        public Dictionary<string, string> headerData { get; set; }
        public Dictionary<string, string> rowData { get; set; }
    }

    public HttpResponseMessage Validate(
        string id,
        string column,
        string rowid,
        int? vmnr,
        string isik,
        [FromBody] Body body,

        string dok = null,
        string culture = null,
        uint? company = null
       )
    { ...
控制器中

body.headerData值为null。

根据答案 How to receive dynamic data in Web API controller Post method

body.headerData必须有表单键。 但是,它是空的。

如何将headerData作为控制器中的键,值对?

Chorme开发人员工具显示正确的json发布在正文中:

{"headerData":[{"name":"Kalktoode","value":"kllöklö"},
               {"name":"Kaal","value":""}
              ]}

我试图删除

 public Dictionary<string, string> rowData { get; set; }

来自课堂,但问题仍然存在。

1 个答案:

答案 0 :(得分:2)

您的控制器与您发送的内容不匹配

实际上,你的控制器会将身体反序列化为:

.item {
  order: <integer>;
}

您实际发送的JSON结构。 您的控制器会查找包含2个成员的主体 beeing Dictionnaries ,而不是键值对的数组

如果您希望控制器使用键值对

的数组

通过键值数组,我的意思是:

{
  "headerData": {"someKey":"someValue", "otherKEy":"otherValue"},
  "rowData": {"someKey":"someKey"}
}

您需要将Body对象更新为:

{
  "headerData": [
    {
      "key": "string",
      "value": "string"
    }
  ],
  "rowData": [
    {
      "key": "string",
      "value": "string"
    }
  ]
}