【问题标题】:Ajax call doesn't return successAjax 调用不返回成功
【发布时间】:2016-07-12 09:27:56
【问题描述】:

我有一个 Ajax 调用,它返回一个 JSON 对象,该对象中有一个属性,用于说明调用是否成功。出于某种原因,即使调用成功返回,AJAX 也不会命中它,事实上它总是返回失败。不知道为什么。

AJAX:

    function GetSubTaskStories() {
        $.ajax({
            type: "POST",
            url: "Story.aspx/GetSubTaskStories",
            data: JSON.stringify({ id: GetSubTaskID() }),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (data) {
                if (data.success) {
                    alert("Success: True");
                } else {
                    alert("Success: False");
                }
            },
            error: function (data) {
            }
        });
    }

服务器:

[WebMethod]
    public static string GetSubTaskStories(string id)
    {

        // Do some stuff.
        JavaScriptSerializer jss = new JavaScriptSerializer();
        try
        {
            var storiesObj = new { success = true, stories = stories };
            return jss.Serialize(storiesObj);
        }
        catch (Exception ex)
        {
            var error = new { success = false };
            return jss.Serialize(error);
        }
    }

【问题讨论】:

  • 当你说“它总是作为失败返回”时,你的意思是它运行了“成功”功能,但随后警告“成功:假”,或者你的意思是它运行了“错误”功能?顺便说一句,你的错误函数的签名是错误的,它应该是 Function( jqXHR jqXHR, String textStatus, String errorThrown ) - 见api.jquery.com/jquery.ajax
  • 什么是失败信息?
  • @ADyson,是的,就是这样。该对象作为成功返回,但“Success: False”命中而不是返回“True”。
  • 在成功函数的开头,输入console.log(JSON.stringify(data)); 并检查返回的 JSON 的结构是否完全符合您的预期
  • @MichaelMao,错误消息显示“Success: False”,即使成功属性可能为“true”

标签: c# jquery json ajax


【解决方案1】:

您正在返回一个具有属性d 的对象,该属性是一个包含结果的序列化版本的字符串。从您的示例中很难看出所有引号和转义引号。

删除jss.serialize 并返回匿名对象作为您的结果。

[WebMethod]
public static object GetSubTaskStories(string id)
{

    // Do some stuff.
    try
    {
        var storiesObj = new { success = true, stories = stories };
        return storiesObj;
    }
    catch (Exception ex)
    {
        var error = new { success = false };
        return error;
    }
}

【讨论】:

  • 这确实是问题所在!我已将返回更改为匿名对象而不是对其进行序列化,并且效果很好!
  • 我认为根据评论这个答案是正确的。但是当我使用 jss.serialize 我没有得到 d
  • @MichaelMao 我认为这是在幕后发生的字符串到 JSON 转换的人工制品 - 它自己的字符串不是有效的 JSON,因此 WebMethod/WCF 包装了字符串。
  • 另外,在success函数上,必须是:if (data.d.success)而不是if (data.success)
【解决方案2】:

基于 cmets,我认为您需要将成功函数更改为:

success: function (data) {
  if (data.d.success == true) {
   alert("Success: True");
  } else {
   alert("Success: False");
  }
}

为了反映从服务器返回的 JSON 的结构

【讨论】:

  • 我试过了,但它仍然报告相同的消息:“Success: False”
【解决方案3】:
<script>
function GetSubTaskStories() {
    $.ajax({
        type: "POST",
        url: "GetSubTaskStories",
        data: JSON.stringify({ id: 5 }),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (data) {
            alert(Boolean(data.success));
            if (Boolean(data.success)) {
                alert("Success: True");
            } else {
                alert("Success: False");
            }
        },
        error: function (data) {
        }
    });
}

尝试使用布尔函数

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 2016-01-30
    • 2011-02-14
    相关资源
    最近更新 更多