jQuery.parseJSON无法解析从MVC控制器操作返回的JsonResult

4
我将尝试使用jQuery.parseJSON来解析MVC3控制器操作的返回值。
控制器:
    [HttpPost]
    public JsonResult LogOn(LogOnModel model, string returnUrl)
    {
        .. do stuff ..

        if (errors.Count() < 0)
        {
            return Json(new object[] { true, model, errors });

        }

        return Json(new object[] { false, model, errors });
    }

jQuery:

$.ajax({
                url: form.attr('action'),
                type: "POST",
                dataType: "json",
                data: form.serialize(),
                success: function (data) {
                    var test = jQuery.parseJSON(data);                      
                }   
            });

Fiddler返回的Json结果:

Content-Type: application/json; charset=utf-8

[false,{"UserName":"1","Password":"2","RememberMe":false},[{"Key":"","Errors":[{"Exception":null,"ErrorMessage":"用户名或密码不正确。"}]}]]

Fiddler可以解析这些结果:

enter image description here

调用jQuery.parseJSON返回null。 我的问题是,如何将json返回值解析成对象?

谢谢!

2个回答

6

你不需要在成功处理程序中调用parseJSON,因为ajax已经自动将JSON结果解析为数组(这是因为你指定了dataType:'json')。

然而,我建议返回某种类型的结果对象(无论你是在C#中创建一个实际的类还是使用匿名类型)。

    [HttpPost]
    public JsonResult LogOn(LogOnModel model, string returnUrl)
    {
        .. do stuff ..

        if (errors.Count() < 0)
        {
            return Json(new { success=true, model, errors });

        }

        return Json(new { success=false, model, errors });
    }

并且在客户端

$.ajax({
                url: form.attr('action'),
                type: "POST",
                dataType: "json",
                data: form.serialize(),
                success: function (result) {
                    alert(result.success);
                    // also have result.model and result.errors                      
                }   
            });

jQuery.parseJSON调用仍然返回null。 - rboarman
1
啊...你不需要解析JSON,因为data已经是一个对象了。ajax会尝试解析JSON结果,因为你指定了dataType类型为json。parseJSON期望一个字符串,而你却给了它一个对象,因此返回null。抱歉我没有仔细看清你的问题,我会修改的。 - moribvndvs
我明白了,让我稍微试试这个。 - rboarman

2
您实际上返回的是一个对象数组,它们应该在成功函数中像这样访问:
var booleanValue = data[0];

var yourModel = data[1];

var yourErrors = data[2];

我给 @HackedByChinese 点了赞,因为在最终解决问题时,命名属性可能是更好的方式。但是这并不能解决你当前的问题。


@rboarman 嗯嗯嗯...这是在你的成功方法中读取JsonResult Json(new object[] { false, model, errors }) 的正确语法。也许表单有问题。为什么不尝试将 $.ajax() 调用更改为简单的GET,以逐步解决问题呢? - Craig
@rboarman 我有一个猜测……你在 $.ajax() 调用中使用的 form 变量实际上存在吗?也许你没有注意到 JS 错误。你能确保你已经在获取文档中第一个表单之前声明了 var form = $("form:first");,然后进行了 $.ajax() 调用吗? - Craig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接