我想在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 ;
}
Web服务在下面,但我又无法得到应该是什么而不是???? :
[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
};
}
答案 0 :(得分:5)
第1步,客户端: 您必须将客户端对象序列化为JSON,我个人使用JSON2库的stringify()方法:http://www.json.org/js.html
data: JSON.stringify(myObj)
Step2,服务器端:您必须将序列化对象转换为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...}
答案 1 :(得分:0)
您的asmx页面是否需要肥皂信封?如果是这样,你将很难用xmlhttp请求直接与它连接到额外的标记(它当然可行,但是很痛苦)。您可能希望查看一些创建restful服务的示例,因为它们更容易通过javascript进行通信。看看http://www.west-wind.com/weblog/posts/324917.aspx。
答案 2 :(得分:0)
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;
}
答案 3 :(得分:0)
类似问题的详细解答表明结合JQuery和amp; Json2.stringfy()可用于将复杂类型发送到服务器端方法。
在服务器端,您只需要在Method Signature中输入所需的Type(例如foo(MyType obj){...})
How to send JSON object to asp.net web service and process the data there?
答案 4 :(得分:0)
让我们简化一下: 您有一个服务器端对象实例名称和一个客户端对象实例名称。
在你的jQuery ajax中 - 使用这个表单
data: '{"myServerSideObjectInstanceName":' + JSON.stringify(myClientSideObjectInstanceName) + '}',
在服务器端使用
public void MyWebServiceMethod(myObject myServerSideObjectInstanceName)
{ ... your code here ...}
只要myObject与javascript对象具有相同的签名,这就行了。您可以使用myServerSideObjectInstanceName.StudentName(或其他)之类的东西来获取您的值(在服务器上)。