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

时间:2010-04-15 13:36:44

标签: c# jquery json web-services

我想在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
                  };
}

5 个答案:

答案 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(或其他)之类的东西来获取您的值(在服务器上)。