2011-10-20 22 views
13

我無法獲得以下功能才能正常工作。它似乎是序列化它錯了。這是關於不同數據變體的第5次迭代。我最初只是在做數據:{'id':id}就像我在使用WCF時一樣,但是使用ASMX它不起作用。它看起來像是將數據序列化爲id = 1234而不是id:1234,但我對此很新。任何幫助,將不勝感激。哦,我可以直接在瀏覽器中調用該服務,它會正確返回數據,所以我知道這不是服務。無效的JSON原語:編號

function getVentID(id) { 
    //look up id in database and get VentID 
    alert('id: ' + id); 
    var jsdata = { "id": + id} 
    $.ajax({ 
     type: 'POST', 
     contentType: 'application/json; charset=utf-8', 
     url: 'services/UserService.asmx/getVentID', 
     data: jsdata, 
     dataType: 'json', 
     success: function (msg) { 
      alert(msg.d); 
     }, 
     error: function (a, b, c) { 
      alert('Error: ' + a.toString() + ' ' + b.toString() + " " + c.toString()); 
     } 
    }); 
} 

p.s.我知道有10個相同的問題,但他們都沒有答案,我可以找到或爲我工作。

回答

30

最簡單的可能的修復是改變開始var jsdata到行:

var jsdata = '{id:' + id + '}'; 

的問題是,jQuery是編碼jsdata作爲表格數據,而不是作爲JSON。 dataType參數影響響應的解析方式,而不影響POST數據的編碼方式。

據我所知,jQuery中實際上沒有任何JSON序列化代碼。顯然John Resig suggests using Douglas Crockford's json2.js

要使用它,添加腳本參考json.js然後:

var jstext = JSON.stringify(jsdata, null, 2); 
+1

當然,從技術上就解決我張貼的錯誤,但現在我得到:無效的Web服務調用,進行參數缺失值:\ u0027ID \ u0027「」堆棧跟蹤「:」在System.Web.Script .Services.WebServiceMethodData.CallMethod ...等任何想法? –

+0

我試圖改變的情況下,因爲新的錯誤說ID而不是ID,但它並沒有幫助,我甚至不知道這是否相關... –

+0

嗯。我承認我並不完全知道asmx的期望。什麼是您在瀏覽器中直接進行的操作的示例?我肯定可以幫助翻譯成jQuery調用。 – sblom

0

我現在解決了這個問題。

您需要通過URL格式爲:

http://domain.com.br/service.asmx/method?objParam= {問: 「搜索」}

而在你service.asmx文件,你需要聲明此方法:

Public Function method(objParam As Dictionary(Of String, String)) 

End Function 

在您的代碼裏,長相如下:

function getVentID(id) { 
 
    var jsdata = { 
 
    "id": +id 
 
    } 
 
    var sData = JSON.stringify(jsdata); //convert your json in string 
 
    $.ajax({ 
 
    type: 'POST', 
 
    contentType: 'application/json; charset=utf-8', 
 
    url: 'services/UserService.asmx/getVentID', 
 
    data: { 
 
     id: sData 
 
    }, 
 
    dataType: 'json', 
 
    success: function(msg) { 
 
     alert(msg.d); 
 
    }, 
 
    error: function(a, b, c) { 
 
     alert('Error: ' + a.toString() + ' ' + b.toString() + " " + c.toString()); 
 
    } 
 
    }); 
 
}