使用JQUERY ajax函数将JSON对象发送到ASP.NET Web服务

我想在aspx页面的客户端创建对象。 我想为这些javascript类添加函数,以使生活更轻松。

实际上我可以获取并使用从服务返回的对象(从服务器端类派生)。 当我想通过jquery ajax方法从客户端发送对象时,我无法做到:)

这是我的javascript类:

function ClassAndMark(_mark, _lesson){ this.Lesson = _lesson; this.Mark = _mark; } function Student(_name, _surname, _classAndMark){ this.Name = _name; this.SurName = _surname; this.ClassAndMark = _classAndMark; } 

这是Student类调用Web Service的方法:

 JSClass.prototype.fSaveToDB(){ $.ajax({ type: "POST", contentType: "application/json; charset=utf-8", url: "/WS/SaveObject.asmx/fSaveToDB"), data: ????????????, // This might be: JSON.stringify(this) ? // Web service method has a parameter, name is _obj // if i don't send data with parameter, i'm getting this error: // Invalid web service call, missing value for parameter: '_obj' // // Should i send it like that: // data: "{_obj:" + JSON.stringify(this) + "}" // // I tried to wrap this with parameter like that: // data: JSON.stringify("{_obj:" + this + "}") // // But i got this error: // Cannot convert object of type 'System.String' to type 'System.Collections.Generic.IDictionary`2[System.String,System.Object]' dataType: "json" }); } 

要创建javascript对象并调用其方法将其发送到Web服务:

实际上我不知道应该在服务器端定义类和方法,但我认为:

 class ClassAndMark{ public string Lesson ; public string Mark ; } class Student{ public string Name ; public string SurName ; public ClassAndMark classAndMark ; } 

网络服务在下面,但我再也无法得到应该是什么而不是???? :

 [WebMethod()] public Student fSaveToDB(???? _obj) { // How can i convert input parameter/parameters // of method in the server side object? // SQL operations // srting QInsert = "INSERT INTO tableName (......) VALUES (.....)"; // ... // .. // . return new Student{ Name = ???, // deserialize _obj and pass its Name value SurName = ???, // deserialize _obj and pass its SurName value classAndMark = ???, // deserialize _obj and pass its classAndMark value }; } 

第1步,客户端:您必须将客户端对象序列化为JSON,我个人使用JSON2库的stringify()方法: http : //www.json.org/js.html

 data: JSON.stringify(myObj) 

第2步,服务器端:您必须将序列化对象转换为c#代码“可食用”的内容。 在这里,您可以使用Microsoft的JavaScriptSerializer类的deserialize()方法(但如果您没有安装SP,它可能在.net 3.5中有一些问题),或者JSON.net库http://james.newtonking.com/pages /json-net.aspx

服务器端方法签名应该是:

 fSaveToDB(Object myObj) 

其中“myObj”是客户端对象容器的名称:

 {myObj: your object...} 

您的asmx页面是否需要肥皂信封? 如果是这样,你将很难用xmlhttp请求直接与它连接到额外的标记(它当然可行,但是很痛苦)。 您可能希望查看一些创建restful服务的示例,因为它们更容易通过javascript进行通信。 请访问http://www.west-wind.com/weblog/posts/324917.aspx 。

Javascript方面:

 JSClass.prototype.fSaveToDB(){ $.ajax({ type: "POST", contentType: "application/json; charset=utf-8", url: "/WS/SaveObject.asmx/fSaveToDB"), data: data: $.toJSON({ _obj: this }), dataType: "json" }); } 

Web服务是:

 [WebMethod()] public Student fSaveToDB(Student _obj) { return bla bla bla; } 

类似问题的详细解答表明,组合JQuery和Json2.stringfy()可用于将复杂类型发送到服务器端方法。

在服务器端,您只需要在方法签名中放入所需的Type(例如foo(MyType obj){…})

如何将JSON对象发送到asp.net Web服务并处理数据?

让我们简化一下:您有一个服务器端对象实例名称和一个客户端对象实例名称。

在你的jQuery ajax中 – 使用这个表单

 data: '{"myServerSideObjectInstanceName":' + JSON.stringify(myClientSideObjectInstanceName) + '}', 

在服务器端使用

 public void MyWebServiceMethod(myObject myServerSideObjectInstanceName) { ... your code here ...} 

只要myObject与javascript对象具有相同的签名,这就行了。 您可以使用myServerSideObjectInstanceName.StudentName(或其他)之类的东西获取您的值(在服务器上)。