2010-04-15 96 views
6

我想在aspx页面的客户端创建对象。我想为这些JavaScript类添加功能以使生活更轻松。使用JQUERY ajax函数发送JSON对象到ASP.NET Web服务

其实我可以得到并使用从服务返回的对象(派生自服务器端类)。当我想的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服务:

其实我不知道应该是什么的类和方法定义S于服务器端,但我认为:

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

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

data: JSON.stringify(myObj) 

第二步,服务器端:你必须将序列化的对象转换成你的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...} 
+0

这不工作“数据:JSON.stringify(myObj)”,因为Web服务方法有参数名称,它给出了错误,如“你没有用这个参数调用我”... – uzay95 2010-04-15 14:17:42

+2

你试过包装你的对象,就像我在最后一行写的那样? 像这样:data:JSON.stringify({paramName:myObj}) – mamoo 2010-04-15 14:28:20

+0

我试过并得到这个错误:无法将类型'System.String'的对象转换为类型'System.Collections.Generic.IDictionary'2 [System.String ,System.Object]' 你有什么想法吗?并感谢您的帮助... – uzay95 2010-04-15 14:45:39

0

是您的ASMX页期待一个SOAP信封?如果是这样,你将有一个艰难的时间直接连接到一个xmlhttp请求做额外的标记(这当然可以,但是很痛苦)。您可能想查看一些创建宁静服务的示例,因为它们将更容易通过javascript进行通信。看看http://www.west-wind.com/weblog/posts/324917.aspx

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; 
} 
+0

在jQuery中没有这样的函数 - 你在使用什么版本? Uncaught TypeError:$ .toJSON不是函数 – MC9000 2017-01-15 19:03:42

0

让我们来简化这个: 你有一个服务器端对象实例名称和客户端的对象实例名称。

在你的jQuery阿贾克斯 - 使用这种形式

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

在服务器端使用

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

只要myObject的具有相同签名的JavaScript对象,这会工作。你可以使用像myServerSideObjectInstanceName.StudentName(或其他)的东西来获取你的值(在服务器上)。

相关问题