将JSON发布到控制器MVC 5

时间:2017-02-05 13:33:32

标签: json asp.net-mvc

我将JSON发布到我的控制器,但问题是我在列表中获得了正确的计数。即如果JSON有两个元素,则列表包含两个但是为空的数据。以下是我正在制作和发送JSON的代码。我使用TabletoJSON来制作JSON。

        $('#productsObj').click(function () {
            var rawMaterials = $('#productsTable').tableToJSON(
                        {
                            ignoreColumns: [3]
                        });

           alert(JSON.stringify(rawMaterials));
            console.log(rawMaterials);

                $.ajax({
                    url: "/Supplies/insertRawMaterial",
                    type: "POST",
                    data: JSON.stringify(rawMaterials),
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    traditional: true,
                    error: function (response) {
                        alert(response.responseText);
                    },
                    success: function (response) {
                        alert(data);
                        alert(response);
                    }
                });

        });

以下是接收数据的控制器操作方法。

 public ActionResult insertRawMaterial(List<String> data)
    {

        if (data != null)
        {
            return Json("Success");
        }
        else
        {
            return Json("An Error Has occoured");
        }

    }

我不确定我做错了什么。以下是警报中的JSON。

[{"Raw Material Name":"Asphalt","Short Code":"AS02","Price":"20"}]

1 个答案:

答案 0 :(得分:1)

您不可能期望将此复杂的JSON结构映射到控制器操作当前作为参数的字符串列表(List<String>):

[{"Raw Material Name":"Asphalt","Short Code":"AS02","Price":"20"}]

因此,您可以从定义将反映此结构的适当视图模型开始(或几乎,请参阅下面所需的按摩技术):

public class MaterialViewModel
{
    public string Name { get; set; }

    public string ShortCode { get; set; }

    public decimal Price { get; set; }
}

您的控制器操作将作为参数:

public ActionResult insertRawMaterial(IList<MaterialViewModel> data)
{
    ...    
}

最后按下客户端上的数据以匹配正确的属性名称(名称,shortCode和当然的价格):

// we need to massage the raw data as it is crap with property names
// containing spaces and galaxies and stuff
var massagedRawMaterials = [];

for (var i = 0; i < rawMaterials.length; i++) {
    var material = rawMaterials[i];
    massagedRawMaterials.push({
        name: material['Raw Material Name'],
        shortCode: material['Short Code'],
        price: material['Price']
    });
}

$.ajax({
    url: "/Supplies/insertRawMaterial",
    type: "POST",
    data: JSON.stringify(massagedRawMaterials),
    contentType: "application/json; charset=utf-8",
    ...

这就是说,如果您当前使用的客户端库产生了这种不确定的属性名称,您可以考虑用更合适的东西替换它。