【问题标题】:Sending a JSON object to an ASP.NET web service using JQUERY ajax function使用 JQUERY ajax 函数将 JSON 对象发送到 ASP.NET Web 服务
【发布时间】:2011-02-08 09:31:18
【问题描述】:

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

【问题讨论】:

    标签: c# jquery json web-services


    【解决方案1】:

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

    data: JSON.stringify(myObj)
    

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

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

    fSaveToDB(Object myObj)
    

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

    {myObj: your object...}
    

    【讨论】:

    • 这不起作用“数据:JSON.stringify(myObj)”,因为 Web 服务方法具有参数名称,并且它给出了诸如“你没有用这个参数给我打电话”这样的错误......
    • 您是否尝试过像我在最后一行中所写的那样包装您的对象?像这样: data: JSON.stringify({ paramName: myObj })
    • 我试过并得到了这个错误:无法将“System.String”类型的对象转换为“System.Collections.Generic.IDictionary`2[System.String,System.Object]”类型任何想法 ?并感谢您的帮助...
    • 能否请您发布服务器方法完整签名?
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      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"
          });
      }
      

      网络服务是:

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

      【讨论】:

      • jQuery 中没有这样的功能 - 你使用的是什么版本?未捕获的类型错误:$.toJSON 不是函数
      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

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

        在您的 jQuery ajax 中 - 使用此表单

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

        在服务器端使用

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-25
          • 2011-09-13
          • 2016-11-07
          相关资源
          最近更新 更多