MVC控制器不接受多维JSON

时间:2016-02-08 16:37:57

标签: asp.net-core asp.net-core-mvc

我正在使用ASP.NET 5 RC1 Update1

我有一个jquery ajax调用,它通过POST将html表的JSON数据发布到MVC控制器方法。但是,控制器方法似乎无法接收此数据。

HTML:

<table  id="datatab"  border="1">
    <tbody>
        <tr role="row" class="odd">
            <td class="sorting_1" style="display: none;">2087971</td>
            <td>1</td>
            <td>1</td>
            <td>aaaa</td>
            <td>John Smith</td>
            <td><input type="text"  name="value1" value="1"></td>
            <td><input type="text"  name="value2" value="2"></td>
            <td><input type="text"  name="value3" value="3"></td>
            <td></td>
         </tr>
        <tr role="row" class="even">
            <td class="sorting_1" style="display: none;">2087972</td>
            <td>2</td>
            <td>2</td>
            <td>bbbb</td>
            <td>Peter Parker</td>
            <td><input type="text"  name="value1" value="4"></td>
            <td><input type="text"  name="value2" value="4"></td>
            <td><input type="text"  name="value3" value="4"></td>
            <td></td>
        </tr>
    </tbody>
</table>
<button id="GetData">Get data</button>

jquery的:

<script>
   $("#GetData").click(function (event) {
            debugger;
            event.preventDefault();

            var TableData = new Array();
            $('#datatab tbody tr').each(function (row, tr) {
                TableData[row] = {
                    "Id": $(tr).find('td:eq(0)').text()
                      , "Input1Value": $(tr).find('td:eq(5) input').val()
                      , "Input2Value": $(tr).find('td:eq(6) input').val()
                      , "Input3Value": $(tr).find('td:eq(7) input').val()
                }
            });
            var myData = JSON.stringify(TableData);
            $.ajax({
                type: "POST",
                contentType: "application/json; charset=UTF-8",
                url: '@(Url.Action("UpdateData", "MyController"))',
                data: "myData=" + myData,
                success: function (msg) {

                }
            });

        });
</script>

因为我要做的第一件事是验证控制器是否可以接收数据然后将控制器方法更改为

public IActionResult UpdateData(string[][] myData)

然而,当我在这个ActionResult行上设置一个断点并检查myData的值是什么时,它就是一个空数组。

我使用Fiddler确认是否发送了JSON数据,Fiddler确认了这一点:

  

myData的= [{&#34;标识&#34;:&#34; 2087971&#34;&#34; Input1Value&#34;:&#34; 1&#34;&#34; Input2Value&#34 ;:&#34; 2&#34;&#34; Input3Value&#34;:&#34; 3&#34;},{&#34;标识&#34;:&#34; 2087972&#34;,& #34; Input1Value&#34;:&#34; 4&#34;&#34; Input2Value&#34;:&#34; 4&#34;&#34; Input3Value&#34;:&#34; 4&# 34;}]

我也尝试将[FromBody]添加到ActionMethod参数

public IActionResult UpdateData([FromBody] string[][] myData)

但是myData值为null

Whey没有填充myData变量。 我做错了什么?

1 个答案:

答案 0 :(得分:1)

您要发送的数据看起来更像是String of String,String的集合/数组。

[{
    "Id": "2087971",
    "Input1Value": "1",
    "Input2Value": "2",
    "Input3Value": "3"
}, {
    "Id": "2087972",
    "Input1Value": "4",
    "Input2Value": "4",
    "Input3Value": "4"
}]

因此,请将您的操作方法参数类型更改为

[HttpPost]
public IActionResult UpdateData([FromBody] List<Dictionary<string,string>> myData)
{
    // do something with myData;
    return Json(myData);
}

此外,在您的ajax调用中,只需将数组的字符串化版本作为data属性值发送。

var myData = JSON.stringify(TableData);
$.ajax({
    type: "POST",
    contentType: "application/json; charset=UTF-8",
    url: '@(Url.Action("UpdateData", "MyController"))',
    data: myData,
    success: function (msg) {
          console.log(msg);
    }
});