【问题标题】:Controller does not get json data控制器没有得到 json 数据
【发布时间】:2017-12-06 12:33:07
【问题描述】:

我正在尝试将 json 数据从视图传递到控制器,但控制器一直为 null 我尝试了所有方法来解决此问题,但没有找到任何解决方案,这是我的控制器和 json 数据

$("#ex_save").on("click",function() {
        var array = @Html.Raw(Json.Encode(Model));
        var json = JSON.stringify(array);
        $.ajax({
            type: "POST",
            url: "/Equipment/BulkUpdate",
            data: { jsonCollection : json },
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function () { 
                console.log("Saved"); 
            },
            error: function (e) {
                console.log(e);
            }
        });
    });

这是我将数据传递给控制器​​的 ajax 方法。 这是我的控制器来获取这些数据:-

[HttpPost]
    public ActionResult BulkUpdate(string jsonCollection)
    {
        try
        {
            return View();
        }
        catch
        {
            throw;
        }
    }

这是我传递的 json

这是错误:-

【问题讨论】:

  • 您在 JSON 中发送 JSON 而不是仅使用标准 ModelBinder 是否有特定原因?似乎你只是在无缘无故地增加复杂性,除了给自己更多的工作。
  • @RoryMcCrossan 我有可编辑的表格,我正在查看,因此用户可以编辑它并按提交保存,但我有分页,所以它只将第一页数据传递给控制器​​集合,所以我尝试了这个方式。
  • 您正在传递一个字符串并期待一个字符串,但您的 $.ajax 调用告诉它它实际上是 json(如果不是,它是一个字符串)。将 contentType 更改为 string 或将其删除。 stackoverflow.com/a/18701357/2181514
  • @RoryMcCrossan nope not working 仍然收到此错误 Invalid JSON primitive: jsonCollection. 我将 dataType json 更改为 text
  • @RoryMcCrossan 没有在控制器获得价值,但错误已解决。

标签: c# jquery json post model-view-controller


【解决方案1】:

你需要这样做

$("#ex_save").on("click",function() {
        var array = @Html.Raw(Json.Encode(Model));
        var jsonData =  {jsonCollection : array};
        var postJson = JSON.stringify(jsonData);
        $.ajax({
            type: "POST",
            url: "/Equipment/BulkUpdate",
            data: postJson,
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function () { 
                console.log("Saved"); 
            },
            error: function (e) {
                console.log(e);
            }
        });
    });

您所做的是使用JSON.stringify() 转换array 变量中的JSON,然后将其分配给新的JSON 对象{ jsonCollection : json } 作为POST 请求正文。所以它是一个有效的 json 对象,比如 {'name':'test1', 'age':'12'} 那么 jQuery 可能不会将其作为 json 数据发送,而是将其序列化为 name=test1&age=12 因此你得到错误 "Invalid JSON primitive: name"

在你的情况下,"Invalid JSON primitive: jsonCollection"。所以尝试使用上面的代码。

【讨论】:

  • 它帮助现在没有出错,但仍然没有在控制器上获取集合值。
  • 但我认为这里的问题是解决错误。现在,您可以在服务器中检查响应数据或请求有效负载并进行调试。
  • 我也认为应该是绿色的,因为答案解决了错误。
  • 您能否将其标记为绿色,或者如果您需要我方面的其他任何东西来改进答案?
【解决方案2】:
$("#ex_save").on("click",function() {
    var array = @Html.Raw(Json.Encode(Model));
    var jsonData =  {jsonCollection : array};
    var postJson = JSON.stringify(jsonData);
    $.ajax({
        type: "POST",
        url: "/Equipment/BulkUpdate",
        data: postJson,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function () { 
            console.log("Saved"); 
        },
        error: function (e) {
            console.log(e);
        }
    });
});

而不是在控制器上获取字符串,而是尝试获取 ICollection

[HttpPost]
public ActionResult BulkUpdate(ICollection<your_class_type> jsonCollection)
{
    try
    {
        return View();
    }
    catch
    {
        throw;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-16
    • 2018-04-15
    • 2019-04-20
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多