ASP.NET AJAX返回JSON但未被识别为JSON

时间:2012-03-30 08:35:35

标签: jquery ajax asp.net-3.5

我有这个功能让我回到经理列表

function getManagers() {
   var jqxhr = $.ajax({
                   type: 'POST',
                   contentType: "application/json; charset=utf-8",
                   url: '/webservice.asmx/GetManagers',
                   dataType: 'json'
               }).success(function(data) {
                   var options = '<option selected="selected" disabled="disabled">Select Manager</option>';
                   for (var i = 0; i < data.length; i++) {
                       options += '<option value="' + data[i].PostRef + '">' + data[i].Description + '</option>';
                   }
                   $('#ReceivingCellManager').html(options);
               }).error(function(data) {
                   $('.ErrorText').html('Manager load failed please refresh page with F5');
                   $("#errormessage").dialog('open');
               }).complete(function() {
           });
} 

正如您所看到的,我正在使用JQuery并希望使用可用的管理器来填充下拉列表

我服务中的方法如下所示

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public void GetManagers()
    {
        using (var context = new ConcessionModel())
        {             
            var rcm = Business.GetManager();
            var serializer = new JavaScriptSerializer();
            var response = rcm.Count() != 0
                ? serializer.Serialize(rcm)
                : serializer.Serialize(new Error { Code = "500", Message = "Manager Retrieval Failed" });
            this.Context.Response.Clear();
            this.Context.Response.ContentType = "application/json";
            this.Context.Response.Write(response);
        }
    }

当调用该方法时,我收到 200 OK 的响应,并且响应中包含JSON我希望我遇到的问题是响应未被识别为JSON。

我已经尝试

  • dataType 添加到ajax调用中,如上所示
  • 从响应结束时删除 this.Context.Response.flush ,这样可以解决我们在发送标题后调整标题时遇到的错误。
  • 向方法添加响应格式
  • 向Context添加 Response.ContentType 这些都未能让我获得JSON所需的认可。任何帮助将不胜感激。

更新:JSON格式

{ “描述”: “数据”, “代码”: “数据”, “参考”: “数据”}

更新JSON响应 我在回复中看到一些奇怪的东西,我的回答如下

[{"Description":"data","Code":"data","reference":"data"}]{"d":null}

我不确定 d null 对象

是什么

5 个答案:

答案 0 :(得分:5)

为了从服务中访问json对象(如“Dog”类的对象),方法返回类型应为“Dog”。不要在服务中使用response.write。然后,您可以使用“data.d”从成功消息中访问数据。

希望这有帮助!

答案 1 :(得分:2)

通过从ajax请求中删除contentType并将设置添加到网络配置来解决此问题,如本文Request format is unrecognized for URL unexpectedly ending in中所述

感谢您的所有帮助全面提升:1)

答案 2 :(得分:1)

尝试解析它,如下所示,它适用于我:

var result = JSON.parse(data, function (key, value) {
                    var type;
                    if (value && typeof value === 'object') {
                        type = value.type;
                        if (typeof type === 'string' && typeof window[type] === 'function') {
                            return new (window[type])(value);
                        }
                    }
                    return value;
                });

并将数据更改为结果:

for (var i = 0; i < result.length; i++) {
                       options += '<option value="' + result[i].PostRef + '">' + result[i].Description + '</option>';
                   }

答案 3 :(得分:1)

在success函数中,返回对象是'data'。

要访问json数据,您需要通过'data.d'访问它。

我无法帮助,但请注意您的网络服务确实返回无效,也许这也可能是为什么没有回应?

答案 4 :(得分:1)

这对我有用:

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public void HelloWorld() {

    JavaScriptSerializer serializer = new JavaScriptSerializer();

    string strResponse = serializer.Serialize("World"); ;

    Context.Response.Clear();
    Context.Response.ContentType = "application/json";
    Context.Response.AddHeader("content-length", strResponse.Length.ToString());
    Context.Response.Flush();

    Context.Response.Write(strResponse);


}