2013-03-19 55 views
0

我陷入了這個問題,我無法解決。我嘗試了很多解決方案,我也搜索了很多問題,並在StackOverflow上找到了解決此問題的許多問題,但沒有任何方法適用於我。 這是我的問題: 我有這個功能JSON原始無效Ajax jQuery調用

$.ajaxWS = function (options) { 
    options.url = app.siteUrl + options.url; 
    var data = JSON.stringify(options.data); 
    var defaults = { 
     type: "GET", 
     contentType: "application/json; charset=utf-8", 
     url: location.protocol + '//' + location.host + location.pathname, 
     dataType: "json", 
     cache: false, 
     crossDomain: true, 
     data: JSON.stringify(options.data), 
     converters: { 
      "text json": function (jsonString) { 
       var res = JSON.parseNet(jsonString); 
       if (res && res.hasOwnProperty("d")) res = res.d; //.net 3.5 
       return res; 
      } 
     }, 
     success: function (response, textStatus, XMLHttpRequest) { 
      options.success(response, textStatus, XMLHttpRequest); 
     }, 
     error: function (xhr, textStatus, errorThrown) { 
      if(xhr.status != 0) 
       options.error(xhr, textStatus, errorThrown); 
     } 
    }; 
    var options = $.extend(defaults, options); 
    return $.ajax(options); 

};

並且當我通過在現場數據的任何字符串,如這些

$.ajaxWS({ 
    url: "urlFunction", 
    data: { field1: $('#text1').val(), field2: $('#text2').val() }, 
    success: function(){ 
     alert('Success!'); 
    }, 
    error: function(xhr, textStatus, errorThrown){ 
     alert(errorThrown); 
    } 
}); 

它總是返回此錯誤

{"Message":"JSON primitive not valid: field1.","StackTrace":" in System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject()\r\n in System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)\r\n in System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)\r\n in System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)\r\n in System.Web.Script.Services.RestHandler.GetRawParamsFromGetRequest(HttpContext context, JavaScriptSerializer serializer, WebServiceMethodData methodData)\r\n in System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.ArgumentException"} 

我發現一種解決方案,這種方式引用參數

data: { field1: "'" + $('#text1').val() + "'", field2: "'" + $('#text2').val() + "'" }, 

但這只是一個解決方法。 我打了很多也與$就選擇像

processData: false, 
traditional: true, 

或者傳遞數據不

data: JSON.stringify(options.data), 

,但只有

data: options.data, 

或將其引號之間,但所有的這嘗試不起作用。 我給你另外一個信息:這個方法使用整數和日期。只有字符串給出問題。 你有什麼想法來解決這個問題嗎? 非常感謝。

+0

我發現這也有點麻煩。我堅持使用JSON.stringify,因爲編寫所有這些引號會使代碼更容易出錯。有沒有理由不使用帶參數的函數?如果沒有,只要堅持有效。 – 2013-03-19 09:17:00

回答

0

我找到的解決方案就是這樣。在POST中傳遞所有數據

$.ajaxWS = function (options) { 
    options.url = app.siteUrl + options.url + (app.SessionID?"?ASPSESSID=" + app.SessionID:""); 
    options.data = JSON.stringify(options.data); 

    var defaults = { 
     type: "POST", 
     contentType: "application/json; charset=utf-8", 
     url: location.protocol + '//' + location.host + location.pathname, 
     dataType: "json", 
     cache: false, 
     crossDomain: true, 
     data: {}, 
     converters: { 
      "text json": function (jsonString) { 
       var res = JSON.parseNet(jsonString); 
       if (res && res.hasOwnProperty("d")) res = res.d; //.net 3.5 
       return res; 
      } 
     }, 
     success: function (response, textStatus, XMLHttpRequest) { 
      options.success(response, textStatus, XMLHttpRequest); 
     }, 
     error: function (xhr, textStatus, errorThrown) { 
      if(xhr.status != 0) 
       options.error(xhr, textStatus, errorThrown); 
     } 
    }; 
    var options = $.extend(defaults, options); 
    return $.ajax(options); 

};

,在我的ASP.Net項目這條線

<add name="Access-Control-Allow-Methods" value="POST, GET, OPTIONS"/> 

以這種方式,我可以悄悄地傳遞的web.config中添加PARAMS沒有單引號。

0

格式錯誤的JSON可能是您的問題的原因。

JSON解析非常嚴格。字符串必須始終用雙引號括起來。我會建議通過http://jsonlint.com/傳遞您生成的JSON來發現任何錯誤。

+0

沒有錯誤,來自驗證器。試試這個 { 「字段1」:「富」, 「字段2」:「foo2的」, 「字段3」:「foo3」 } 但對每一個參數,這將不無單引號工作 – cyberfido 2013-03-19 11:21:09

+0

而是這個作品 {field1「:」'foo'「, 」field3「:」'foo2'「, 」field3「:」'foo3「」 } 並且也是有效的JSON。我不明白爲什麼第一個不行。 – cyberfido 2013-03-19 11:26:39

+0

參數必須包含在DOUBLE引號中(如您在此處粘貼的代碼),而不是像您所說的那樣使用單引號。 – 2013-03-20 04:13:55