【问题标题】:MVC controller not accepting multidimensional JSONMVC 控制器不接受多维 JSON
【发布时间】:2016-02-08 16:37:56
【问题描述】:

我正在使用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=[{"Id":"2087971","Input1Value":"1","Input2Value":"2","Input3Value":"3"},{"Id":"2087972"," Input1Value":"4","Input2Value":"4","Input3Value":"4"}]

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

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

但是 myData 的值是null

乳清不会填充myData 变量。 我做错了什么?

【问题讨论】:

  • myData 不是一个数据结构数组,为什么不让它成为一个数组数组,就像您的操作所期望的那样?

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


【解决方案1】:

您要发送的数据看起来更像是字符串、字符串字典的集合/数组。

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

所以把你的action方法参数类型改成

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

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

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);
    }
});

【讨论】:

    猜你喜欢
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 2015-03-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    相关资源
    最近更新 更多