【问题标题】:getJSON callback not firinggetJSON 回调未触发
【发布时间】:2011-02-12 13:46:35
【问题描述】:

我正在使用以下脚本进行调用,该脚本在单击锚标记时调用

function GetToken(videoId) {
  debugger;
  var json = $.getJSON("/Vod/RequestAccessToken/" + videoId, function(result) {
    alert("token recieved: " + result.token);
  });
}

在服务器应用程序中,我收到了调用,所以我知道它是一个有效的 URL,但没有调用回调。如果我通过 jquery 代码 (f11/f10) 设置回调被调用??!!!?

服务器以类的形式从 MVC 应用程序返回结果

// function called
public JsonResult RequestAccessToken(int id)
{
    Token t = new Token();
    t.MasterId = Guid.NewGuid();
    var result = new TokenResult(t.MasterId);
    return this.Json(result, JsonRequestBehavior.AllowGet);
}

// class returned
public class TokenResult
{
    public TokenResult() { }
    public TokenResult(Guid g) { token = g.ToString(); }
    public string token = null;
}

当我通过浏览器结果访问 url =

{
  "token":"c877453e-739d-4883-9310-91ddd707d6af"
}

【问题讨论】:

    标签: c# jquery asp.net ajax json


    【解决方案1】:

    如果您的结果不成功,该回调将不会触发,这通常是由于返回的 JSON 无效。给它一个测试,你可以使用$.getJSON的长格式,这样你就可以看到错误:

    $.ajax({
      url: url,
      dataType: 'json',
      success: function(result){
        alert("token recieved: " + result.token);
      },
      error: function(request, textStatus, errorThrown) {
        alert(textStatus);
      },
      complete: function(request, textStatus) { //for additional info
        alert(request.responseText);
        alert(textStatus);
      }
    });
    

    如果是 JSON/解析器错误,您可以在此处查看 JSONLint 的问题:http://www.jsonlint.com/

    【讨论】:

    • @Marty - 你遇到了什么错误...它的存在是有原因的,总是发布它。
    • 我没有收到错误消息。它默默地失败了。 json 结果 = {"token":"c877453e-739d-4883-9310-91ddd707d6af"}
    • @Marty - 试试我更新的答案,看看完整抛出了什么,它确实看起来像一个解析错误默默地失败,看看上面的完整方法警告 exact responseText,需要查看文字响应以检查是否有任何无效。
    • IE == 没有发生任何事情(甚至没有命中调试器)FF == 错误、空白、错误
    【解决方案2】:

    一个可能的赌注是您没有返回有效的 JSON。 jQuery 文档指出,“从 jQuery 1.4 开始,如果 JSON 文件包含语法错误,请求通常会静默失败。”您提供的 JSON 文本是否通过 JSON Lint?您可能还想(至少暂时)切换到jQuery.ajax。它允许更多的错误处理。比如:

    $.ajax({
      url: "/Vod/RequestAccessToken/"+videoId,
      dataType: 'json',
      error: function(xhr, textStatus, errorThrown){
    
            },
      success: function(result){
                alert("token recieved: " + result.token);
            }
    });
    

    【讨论】:

    • jsoneditoronline.org 是发现错误的有用在线工具。只需将 json 粘贴到左侧即可。
    【解决方案3】:

    来自 jQuery 的documentation

    重要提示:从 jQuery 1.4 开始,如果 JSON 文件包含语法错误,请求通常会静默失败。

    那么,你的 JSON 有效吗?

    function GetToken(videoId) {
        debugger;
        console.log('getting it');
        var json = $.get("/Vod/RequestAccessToken/"+videoId, function(result){
            console.log('got it');
        });
    }
    

    上面的输出是什么? (假设你的浏览器有console。)

    【讨论】:

      【解决方案4】:

      您是在锚点的点击处理程序中调用 preventDefault() 还是返回 false?

      【讨论】:

        【解决方案5】:

        在调用序列化 Json 方法时,您需要在控制器操作中发出信号以允许 JSONGets:

         public JsonResult ActionDateClicked(ActionViewModel vm)
                {
                    vm.Model.Observation = "Changed";
                    return Json(vm, JsonRequestBehavior.AllowGet);
                }
        

        【讨论】:

          猜你喜欢
          • 2012-02-21
          • 1970-01-01
          • 2013-09-07
          • 2020-08-08
          • 1970-01-01
          • 2011-08-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多