代码之家  ›  专栏  ›  技术社区  ›  uzay95

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

  •  6
  • uzay95  · 技术社区  · 14 年前

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

    这是学生班调用Web服务的方法:

    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 回复  |  直到 7 年前
        1
  •  5
  •   mamoo    14 年前

    步骤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...}
    
        2
  •  0
  •   roto    14 年前

    您的asmx页面需要SOAP信封吗?如果是这样的话,您将很难通过xmlhttp请求直接连接到它,而需要对附加的标记进行处理(当然可以,但这是一种痛苦)。您可能需要查看一些创建RESTful服务的示例,因为它们更容易通过JavaScript进行通信。看一看 http://www.west-wind.com/weblog/posts/324917.aspx .

        3
  •  0
  •   uzay95    14 年前

    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;
    }
    
        4
  •  0
  •   Community TheSoundDefense    7 年前

    类似问题的详细答案说明结合jquery&json2.stringfy()可以用于将复杂类型发送到服务器端方法。

    在服务器端,您只需要将所需的类型放入方法签名中(例如foo(mytype obj)…})

    How to send JSON object to asp.net web service and process the data there?

        5
  •  0
  •   MC9000    7 年前

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

    在jQueryAjax中-使用此表单

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

    在服务器端使用

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

    只要myObject与您的javascript对象具有相同的签名,这将起作用。您可以使用类似于myserverSideoObjectInstanceName.studentName(或其他任何东西)的工具获取值(在服务器上)。