Json未正确绑定为C#对象

时间:2018-06-25 06:39:39

标签: c# asp.net ajax

我的应用是在ASP.NET MVC 5中制作的。用户可以使用显示已过滤数据的搜索表单。现在,我想添加一个按钮,它将导出显示的数据。

为此,我发送Search对象以查看并将其保存为html。现在,当单击“导出”按钮时,我想将此对象传递给控制器​​,使用此Search对象从数据库中获取数据并将结果另存为text

问题是我无法将json绑定到c#对象。那就是我的view

<div id="originalForm" style="visibility:hidden">
    @Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model))
</div>

这是我的ajax代码:

function exportRaportToCsv() {
    var $formData = $('#originalForm').text();
    var allIds = getCheckedIds();

    var dataToSend = JSON.stringify({
        ids: allIds,
        search: $formData
    });


    $.ajax({
        type: "POST",
        url: '@Url.Action("ExportToCsv", "BankCosts")',
        data: dataToSend,
        contentType: "application/json; charset=utf-8",
        success: function (datar) {
            window.location = '/BankCosts/Download?fileGuid=' + response.FileGuid
                + '&filename=' + response.FileName;
        },
        error: function (xhr) {
        },
    });
}

这是我的控制器:

[HttpPost]
public ActionResult ExportToCsv(string[] ids, Search search)
{
    // search is null here
}

当我用Fiddler监视发送数据时,可以看到,这是我通过的:

{"ids":[],"search":"\n    {\"ID\":0,\"DateFrom\":\"2018-06-23T00:00:00\",\"DateTo\":\"2018-06-25T00:00:00\",\"hasUnrecognizedStatus\":false,\"skippedSearchResults\":0,\"paginationLimit\":100}\n"}

我认为值得一提的是ids已正确通过。如果包含数据,则传递该数据。我认为问题是我的\中有json。我该如何删除?我的ajax有什么问题吗?

当我使用console.log打印$formData时,我看到\字符消失了,看起来更好了:

{"ID":0,"DateFrom":"2018-06-23T00:00:00","DateTo":"2018-06-25T00:00:00","hasUnrecognizedStatus":false,"skippedSearchResults":0,"paginationLimit":100}

4 个答案:

答案 0 :(得分:0)

[HttpPost]
public ActionResult ExportToCsv(string[] ids,[FromBody]Search search)
{
}

如果您的搜索模型还可以,请尝试添加FromBody。

答案 1 :(得分:0)

根据您的评论,我认为搜索对象已经进行了字符串化,因此您无需对其进行字符串化。

只需将您的json设为

var dataToSend = {
    "ids": allIds,
    "search": $formData
};

答案 2 :(得分:0)

使用JSON.parse()将JSON字符串转换为JavaScript对象。您的$('#originalForm')。text()实际上是JSON字符串。

        var $formData = JSON.parse($('#originalForm').text());
        var allIds = getCheckedIds();

       var dataToSend = JSON.stringify({
            ids: allIds,
            search: $formData
            });

在您的情况下,$ formData是一个字符串(实际上是JSON字符串)。因此,JSON.stringify()再次尝试转换为JSON字符串,该字符串已经是JSON字符串,导致您要发布的表单数据中不必要的'/'字符。

确保在ajax调用属性中将内容类型设置为“ application / json”,否则MVC模型绑定程序将无法从JSON发布的数据映射和填充.NET模型。 contentType:“ application / json; charset = utf-8”,

答案 3 :(得分:-1)

因为您正在使用

  

JSON.stringify

以字符串格式而不是对象发布的搜索值

  

搜索

如此

尝试以此替换您的控制器

[HttpPost]
public ActionResult ExportToCsv(string[] ids, string search)
{
  //then deserialize search json like
  Search objSearch = JsonConvert.DeserializeObject<Search>(search);
}

     [HttpPost]
     public ActionResult ExportToCsv(string[] ids, JObject search)
    {
  //then deserialize search json like
     Search objSearch = JsonConvert.DeserializeObject<Search > 
    (dataModel["search"].ToString());

}

查看

$.ajax({
    type: "POST",
    url: '@Url.Action("ExportToCsv", "BankCosts")',
    data:{ids= allIds.toString(),search:JSON.stringify($formData)}
    contentType: "application/json; charset=utf-8",
    success: function (datar) {
        window.location = '/BankCosts/Download?fileGuid=' + response.FileGuid
            + '&filename=' + response.FileName;
    },
    error: function (xhr) {
    },
});