从控制器返回PartialView时出现JSON.parse错误

时间:2017-11-05 14:10:48

标签: c# .net ajax asp.net-mvc

我有以下ajax调用

    $.ajax({
        type: "POST",
        url: url,
        dataType: "json",
        data: { occupants: occupants },
        success: function (data) {
            $("#summaryContent").html(data);
        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            console.log("Status: " + textStatus);
            console.log("Error: " + errorThrown);
        }
    });

一个看起来像这样的控制器

    [HttpPost]
    public PartialViewResult Verification(List<OccupantDto> occupants)
    {
        //do stuff
        return PartialView();
    }

我在我的ajax调用中遇到了这个错误

Error: SyntaxError: JSON.parse Error: Invalid character at position:5

我尝试从我的ajax调用中移除dataType: "json",删除错误,然后呈现我的局部视图,但是,在我的控制器中,occupants是一个空列表。添加dataType: "json"会在我的控制器中填充occupants,但会引发错误。

1 个答案:

答案 0 :(得分:2)

此部分位于$.ajax方法调用

dataType: "json",

告诉jQuery你希望服务器的结果是一个有效的json字符串。所以jQuery会尝试将它显式解析为js对象(使用JSON.parse()方法),并假设它是一个有效的JSON字符串响应,因为 你保证使用dataType: "json"选项的jQuery

但在您的情况下,您将返回一个视图结果,这只是HTML标记。所以它无法解析为javascript对象。如果要解析的字符串不是有效的JSON,JSON.parse()将抛出一个SyntaxError异常。这就是你得到的,因为parse方法调用崩溃,因此它执行error方法的$.ajax处理程序。

只需删除指定dataType行的那一行。这应该工作

$.ajax({
    type: "POST",
    url: url,
    data: { occupants: occupants },
}).done(function (data) {
    $("#summaryContent").html(data);
}).fail(function (XMLHttpRequest, textStatus, errorThrown) {
    console.log("Status: " + textStatus);
    console.log("Error: " + errorThrown);
});

在大多数情况下,您无需指定dataType属性值。如果没有指定任何内容,jQuery将尝试根据返回的响应的mime类型推断它。

现在,只要您拥有有效的项目数组(与OccupantDto的结构匹配),您的occupants参数将由模型绑定器正确映射,并且不会为null / empty集合

假设OccupantDtoIdName属性(设置表公共属性),这应该有效

var occupants = [{ name: "Scott",id:4},{ name: "Shyju",id:6}];
$.ajax({
    type: "POST",
    url: '@Url.Action("Verification")',
    data: { occupants: occupants }
})

从jQuery 3.0开始,删除了success()error()complete()回调。您可以改用done()fail()always()

相关问题