【问题标题】:Posting JSON to controller MVC 5将 JSON 发布到控制器 MVC 5
【发布时间】:2017-06-22 12:03:55
【问题描述】:

我将 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"}]

【问题讨论】:

  • 请向我们展示您的开发人员工具中的 JSON 有效负载。
  • 好像你在调用 JSON.stringify 的东西已经是一个 JSON 字符串了。
  • @haim770 我已经删除了 JSON.strigify 现在从控制器获得 500。
  • 这是 JSON @Amy [{"Raw Material Name":"Asphalt","Short Code":"AS02","Price":"20"}]
  • @Amy 这里是 JSON [{"Raw Material Name":"Asphalt","Short Code":"AS02","Price":"20"}]

标签: json asp.net-mvc


【解决方案1】:

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

[{"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)
{
    ...    
}

最后在客户端处理您的数据以匹配正确的属性名称(当然是名称、短代码和价格):

// 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",
    ...

话虽如此,如果您当前使用的客户端库产生此类不确定的属性名称,您可能会考虑将其替换为更合适的名称。

【讨论】:

  • 工作就像一个魅力。投票可能:)
猜你喜欢
  • 2012-10-03
  • 2012-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-22
  • 1970-01-01
  • 1970-01-01
  • 2012-04-17
相关资源
最近更新 更多