如何解决无效的JSON原语模型错误?

时间:2016-05-26 16:53:26

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

我在ajax post call中使用以下赋值传递表单数据:

data: {model: JSON.stringify(formData) },

model参数用于告诉stringify方法解析表单数据,因为相同类型的模型与视图绑定。

但是当我将一个JSON bool值返回给ajax方法时,我得到一个源自500内部服务器错误的JSON primitive model is invalid错误。我认为这也导致我的success function ajax代码被解雇。

问题: 如何在返回bool值时解决无效的JSON参数错误?

ajax方法:

var formData = $("createForm").serialize();

$.ajax({
                type: "POST",
                url: '@Url.Action("Index", "CreateEscalation")',
                data: {model: JSON.stringify(formData) },
                cache: false,
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (json) {
                    if (json.Success) {
                        window.location.href = json.redirectUrl;
                    }
                    else{
                        $('#submitStatus').text("Error occurred while processing your request, please try again or contact system administrators");
                        $(this).addClass('alert alert-danger fade in');
                        $('#submitStatus').show();
                    }
                },
                error: function (jqXHR, exception) {


                }

            });

控制器发布方法:

    [HttpPost]
    public ActionResult Index(Escalation escalation)
    {
        try
        {


            bool success = sqlConnection.InsertWebReq(escalation);


            if (success)
            {
                return Json(new
                {
                    redirectUrl = Url.Action("Index", "EscalationHistory"),
                    Success = true
                });

            }
            else
            {
                return Json(new
                {
                    Success = false
                });

            }

        }
        catch (Exception ex)
        {
            return Json(new
            {
                Success = false
            });
        }
    }

4 个答案:

答案 0 :(得分:1)

此:

var formData = $("createForm").serialize();

不为MVC创建有效的JSON来使用。 (https://github.com/maxatwork/form2js

摘录:

  

为什么不.serializeArray()?

     

JQuery的.serializeArray()工作方式有点不同。它通过“对象/嵌套对象的数组”示例中的标记来构建此结构:

[
    { "person.friends[0].email" : "agent.smith@example.com" },
    { "person.friends[0].name" : "Smith Agent" },
    { "person.friends[1].email" : "n3o@example.com" },
    { "person.friends[1].name" : "Thomas A. Anderson" }
]

其次,你是双重编码:

var formData = $("createForm").serialize();  // First encode

$.ajax({
            type: "POST",
            url: '@Url.Action("Index", "CreateEscalation")',
            data: {model: JSON.stringify(formData) },  // Encoding Again ?

所以你是JSON很多垃圾,因为它看起来像:

{
  'model' : 'asdf=1&qwer=2'
}

{
  'model' : '{ asdf:1, qwer:2 }'
}

答案 1 :(得分:0)

根据严格的JSON规范,不允许使用展开的布尔值,这要求所有基元在数组或对象中传递"包装器"。许多JSON序列化/反序列化库确实添加了对未包装原语的支持,但除非您明确知道服务器和客户端库都支持此行为,否则不应指望这种行为。

我的建议是将结果包装在{"result": false}{"result": true}

等对象中

答案 2 :(得分:0)

保持简单并删除contentType: "application/json; charset=utf-8",等额外参数而非双重编码解决了上述Erik的问题。

以下Ajax方法定义在完成时对我有用:

                $.ajax({
                        url: "@(Url.Action("Index", "CreateEscalation"))",
                        type: 'POST',
                    traditional: true,
                    data: $("#createForm").serialize(),
                    dataType: "json",
                    success: function (result) {
                        //todo: use result
                        if (result.Success) {
                            window.location.href = result.redirectUrl;
                        }
                        else {
                            $('#submitStatus').text("Error occurred while processing your request, please try again or contact system administrators");
                            $(this).addClass('alert alert-danger fade in');
                            $('#submitStatus').show();

                        }
                    }
                });

答案 3 :(得分:-1)

我将错误归结为data: {model: JSON.stringify(formData) }它应该是  data: { 'model': JSON.stringify(formData) }