jQuery.parseJSON不适用于来自MVC控制器操作的JsonResult

时间:2012-02-09 00:21:50

标签: asp.net-mvc json asp.net-mvc-3 jquery

我正在尝试使用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;字符集= UTF-8

     

[假,{ “用户名”: “1”, “密码”: “2”, “与rememberMe”:假},[{ “键”: “”, “错误”:[{ “异常”:空“的ErrorMessage”:“其   提供的用户名或密码不正确。“}]}]]

Fiddler可以解析结果:

enter image description here

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

谢谢!

2 个答案:

答案 0 :(得分: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                      
                }   
            });

答案 1 :(得分:2)

您实际上正在返回一个对象数组,并且在成功函数中可以像这样访问它们:

var booleanValue = data[0];

var yourModel = data[1];

var yourErrors = data[2];

我确实给了@HackedByChinese投票,因为命名属性可能是一个更好的方式来实现它。如果这将解决您的直接问题。