2010-06-11 38 views
2

似乎无法找出这一个。Javascript - jquery ajax发布错误使我生气

我有,当我从Vstudio自动生成测试啄测试,工作正常,定义为Web服务(C#,.网)

[WebMethod] 
public string SubmitOrder(string sessionid, string lang,int invoiceno,string email,string emailcc) 
{ 
    //do stuff. 
    return stuff; 
} 

但是,当我把它从jQuery的作为

$j.ajax({ 
     type: "POST", 
     url: "/wservice/baby.asmx/SubmitOrder",      
     data: "{'sessionid' : '"+sessionid+"',"+ 
       "'lang': '"+usersettings.Currlang+"',"+ 
       "'invoiceno': '"+invoicenr+"',"+ 
       "'email':'"+$j(orderids.txtOIEMAIL).val()+"',"+ 
       "'emailcc':'"+$j(orderids.txtOICC).val()+"'}", 
     contenttype: "application/json; charset=utf-8",   
     datatype: "json", 
     success: function (msg) { 
      submitordercallback(msg); 
     }, 
     error: AjaxFailed 
    });  

我得到这个有趣的错误:从{'sessionid' : 'f61f8da737c046fea5633e7ec1f706dd','lang': 'SE','invoiceno': '11867','email':'[email protected]','emailcc':''}

好,不够公平,但这种功能:

 
responseText: System.InvalidOperationException: Missing parameter: sessionid. at 
System.Web.Services.Protocols.ValueCollectionParameterReader.Read(NameValueCollection collection) at 
System.Web.Services.Protocols.HtmlFormParameterReader.Read(HttpRequest request) at 
System.Web.Services.Protocols.HttpServerProtocol.ReadParameters() at 
System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest() 

数据计算结果为jquery与其他webservice通信很好。

定义:

C#:

[WebMethod] 
public string CheckoutClicked(string sessionid,string lang) 
{ 
//*snip* 

//jquery: 

var divCheckoutClicked = function() 
{ 
    $j.ajax({ 
     type: "POST", 
     url: "/wservice/baby.asmx/CheckoutClicked",      
     data: "{'sessionid': '"+sessionid+"','lang': '"+usersettings.Currlang+"'}",   
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: function (msg) { 
      divCheckoutClickedCallback(msg); 
     }, 
     error: AjaxFailed 
    });  
} 
+0

你为什么要在Javascript中构建一个JSON字符串?jQuery完全可以接受一个Javascript数组/对象并自动将其转换为JSON字符串。没有必要手动构建一个 - 考虑如果您插入的任何变量包含引号字符会发生什么 - * boom * – 2010-06-11 05:31:17

+0

数据参数需要一个适当的json对象。你提供的是一个字符串... – deostroll 2010-06-11 05:38:30

+0

他在与字符串正确的轨道上。 ASMX ScriptServices期望它们的输入参数位于JSON字符串中,而不是URLEncoded键/值对。 jQuery URLE对数据参数进行编码,如果它是一个对象,它不适合传递给这种类型的服务。 – 2010-07-26 17:41:08

回答

3
data: {sessionid: sessionid, 
     lang: usersettings.Currlang, 
     invoiceno: invoicenr, 
     email: $j(orderids.txtOIEMAIL).val(), 
     emailcc: $j(orderids.txtOICC).val() 
     }, 
+0

其实@Reigel的回答看起来不错。但我想你仍然需要所有删除引号将参数名 – griegs 2010-06-11 05:26:43

+0

感谢您的输入,删除所有“和”从文字+工作 \t \t数据:{会话ID:会话ID, \t \t \t郎咸平: usersettings.Currlang, \t \t \t invoiceno:invoicenr, \t \t \t电子邮件:附加$ J(orderids.txtOIEMAIL).VAL(), \t \t \t emailcc:附加$ J(orderids.txtOICC).VAL()}, 已工作。 – hreinn1000 2010-06-11 05:46:00

+0

这一切中最让人头疼的事情是,其他方式在其他情况下工作正常。我一直在使用它的引号一段时间,并从未有过任何错误,并且不在其他功能上... – hreinn1000 2010-06-11 05:47:27

0

删除单引号;

data: "{sessionid : "+sessionid+","+ 
       "lang: "+usersettings.Currlang+","+ 
       "invoiceno: "+invoicenr+","+ 
       "email:"+$j(orderids.txtOIEMAIL).val()+","+ 
       "emailcc:"+$j(orderids.txtOICC).val()+"}", 
     contenttype: "application/json; charset=utf-8",  

和移动大括号引号

+0

为什么OP需要刺激数据?为什么不把它作为一个对象传回? – 2010-06-11 05:26:33

+0

这是ASMX ScriptServices的一项要求。他们期望它们的参数在单个JSON字符串中,而不是URLEncoded键/值对。 – 2010-07-26 17:38:27

0

数据应该更像数据外:{会话ID:会话ID,郎咸平:usersettin ...

您现在可以发送的方式,这是一个字符串..所以你的应用程序没有获得变量sessionID,它的价值。

因此,它报告了一个错误。这个错误不是json,所以responseText会抛出一个错误。

+0

只是爱-1,没有迹象表明为什么,几天后的答案... – 2010-07-27 02:29:09

1

通过使用JSON.stringify将客户端对象转换为JSON字符串,可以简化JSON创建并使其更加脆弱。 JSON.stringify作为本机功能内置于较新的浏览器中,可通过包含Douglas Crockford's json2.js将其添加到较旧的浏览器中。

查看using JSON and data transfer objects with ASMX ScriptServices的这篇文章中的一些例子。它的例子与您目前所处的困境几乎完全相同,所以希望这会有所帮助。