jQuery.ajax响应数据未定义

时间:2014-06-11 18:28:55

标签: jquery ajax asp.net-mvc json

以下是我的控制器操作中的代码:

[HttpPost]
public JsonResult MyAction()
{
    try
    {
        // Do something...

        return Json(new { Success = true });
    }
    catch(Exception ex)
    {
        return Json(new { Error = ex.Message });
    }
}

而且,这是我的剧本:

<script>
    $.ajax({
        type: "POST",
        url: '@Url.Action("MyAction", "MyController")',
        dataType: 'json'
    }).done(function (data) {
        alert(data.Success);
    }
    })
    .fail(function (data) {
        alert(data.Error);
    });
</script>

这适用于成功(警报正确显示&#34; true&#34;),但当操作失败时,alert(data.Error)会显示Undefined

使用FireBug,我可以看到正确返回了JSON数据。为什么data.Error&#34;未定义&#34;然后?

更新:

以下是console.log(data)的输出:

readyState
4
responseText
"{"Error":"Attempted to divide by zero."}"
status
500
statusText
"Internal Server Error"
abort
function()
always
function()
complete
function()
done
function()
error
function()
fail
function()
getAllResponseHeaders
function()
getResponseHeader
function()
overrideMimeType
function()
pipe
function()
progress
function()
promise
function()
setRequestHeader
function()
state
function()
statusCode
function()
success
function()
then
function()

更新2:

抱歉,我的代码有问题(不是这里的代码,而是我运行的代码)。 console.log(data)的正确输出是:

Object {Error="Some error."}

3 个答案:

答案 0 :(得分:4)

来自服务器的两个响应都是成功的json响应。就客户而言,请求的任何内容都没有失败。试试这个:

$.ajax({
    type: "POST",
    url: '@Url.Action("MyAction", "MyController")',
    dataType: 'json'
}).done(function (data) {
    if (data.Success) {
        alert('success!');
    } else {
        alert(data.Error);
    }
})

答案 1 :(得分:2)

我刚遇到类似的问题。 调查Developer工具中的响应,我看到即使参数data作为'undefined'传递给'success'函数调用 - 实际的响应体确实包含了预期的字符串。

  

可以在开发人员工具中深入调查响应    - 网络标签 - &gt;按“开始捕获” - 并在实际请求记录中 - 单击“转到详细视图”。

我这边的问题出现在响应的格式错误的Content-Type 标题中。响应字符串已正确传递,甚至可以在其他浏览器(FF,Chrome,Safari)中正确解释。 服务器上设置的标题按以下顺序排列:

  Response.AddHeader "Content-type", "text/html;charset=UTF-8"
  Response.AddHeader "Content-type","application/json"
  Response.ContentType = "application/json"

客户收到的结果(在网络详细视图中调查,如上所述)是:

Content-Type    text/html;charset=UTF-8,application/json

似乎IE(8,9)对标题很挑剔,特别是 Content-Type

IE9中的这个导致IE8以参数数据作为未定义传递 并完成后续失败。 一旦我删除了不需要的标题,即此行:

Response.AddHeader "Content-type", "text/html;charset=UTF-8"

客户收到的最终内容类型只是:

Content-Type    application/json

最后,ajax调用的这一部分中的数据参数不再是“未定义”,而是预期的“对象”

success: function(data, textStatus, XMLHttpRequest){
  alert(typeof(data));
},

* 在这种情况下,服务器端脚本语言是 ASP VBscript ,您应该知道服务器端标头设置的相应语法,以便知道要查找的内容 *

答案 2 :(得分:0)

查看jSON返回,您似乎应该寻找data.responseText.Error

alert( data.responseText.Error );

<强>更新

根据更新后的输出,您正在寻找正确的数据,但回拨错误。当您在服务器端成功handle exceptions时,您可以避免在客户端处理与服务器相关的错误。

正如已经指出的那样,就您的客户端代码而言,请求是成功的,因此您应该在完成回调中寻找data.Error。将您的代码更改为:

.done(function( data ) {
    !data.Success || alert( data.Success );
    !data.Error || alert( data.Error );
})