2010-04-15 35 views
6

Deseo crear un objeto en el lado del cliente de la página aspx. Y quiero agregar funciones a estas clases de JavaScript para facilitar la vida.Envío de un objeto JSON a un servicio web ASP.NET mediante la función JQUERY ajax

En realidad puedo obtener y usar los objetos (derivados de las clases del lado del servidor) que devuelve de los servicios. Cuando quería enviar objetos desde el cliente mediante métodos jquery ajax, yo no podría hacerlo :)

Ésta es mi clase de 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; 
} 

y esto es un método para la clase del estudiante para llamar Web servicio:

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

cree Javascript objeto y llamar a su método para enviarla hacia el servicio web:

en realidad yo no sé lo que debería ser la definición de las clases y método s en el lado del servidor, pero creo que:

class ClassAndMark{ 

    public string Lesson ; 
    public string Mark ; 
} 


class Student{ 

    public string Name ; 
    public string SurName ; 
    public ClassAndMark classAndMark ; 
} 

servicio Web está por debajo pero una vez más no pude conseguir lo que debería ser en lugar de la ???? :

[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 
        }; 
} 

Respuesta

5

Paso 1, el lado del cliente: Tienes que serializar su cliente objetos en JSON, yo personalmente uso el método de la biblioteca JSON2 stringify(): http://www.json.org/js.html

data: JSON.stringify(myObj) 

Paso 2, del lado del servidor : Debe traducir el objeto serializado en algo "comestible" por su código C#. Aquí puede usar el método deserialize() de la clase JavaScriptSerializer de Microsoft (pero puede tener algunos problemas en .net 3.5 si no tiene SP instalado) o la biblioteca JSON.net http://james.newtonking.com/pages/json-net.aspx

firma del método del lado del servidor ser:

fSaveToDB(Object myObj) 

donde "myObj" es el nombre de su contenedor de objetos del lado del cliente:

{myObj: your object...} 
+0

esto no funciona "data: JSON.stringify (myObj)" porque el método del servicio web tiene el nombre del parámetro y está dando un error como "no me llamaste con este parámetro" ... – uzay95

+2

Has intentado envuelva su objeto como lo escribí en la última línea? Me gusta esto: data: JSON.stringify ({paramName: myObj}) – mamoo

+0

Intenté y obtuve este error: No puedo convertir el objeto del tipo 'System.String' para escribir 'System.Collections.Generic.IDictionary'2 [System.String , System.Object] ' ¿Tiene alguna idea? Y gracias por sus ayuda ... – uzay95

0

¿su página asmx esperando un sobre de jabón? Si es así, tendrá dificultades para conectarse directamente con una solicitud xmlhttp del marcado adicional (sin duda es factible, pero es un problema). Es posible que desee ver algunos ejemplos de cómo crear servicios relajantes, ya que será más fácil comunicarse con ellos a través de javascript. Eche un vistazo al http://www.west-wind.com/weblog/posts/324917.aspx. lado

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

servicio web es:

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

No existe tal función en jQuery, ¿qué versión estás usando? TypeError no detectado: $ .toJSON no es una función – MC9000

0

una respuesta detallada a una pregunta similar afirma que la combinación de la jQuery & Json2.stringfy() se puede utilizar para el envío de tipo complejo a los métodos del lado del servidor.

Y en el lado del servidor, solo tendrá que poner el tipo requerido en la firma del método (por ejemplo, foo (MyType obj) {...})

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

0

Vamos a simplificar esto: Usted tiene un nombre de instancia de objeto del lado del servidor y un nombre de instancia de objeto lado del cliente.

En su ajax jQuery - Use este formulario

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

Sobre el uso del lado del servidor

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

Mientras el myObject tiene la firma idéntica como su objeto de JavaScript, esto va a funcionar. Puede obtener sus valores (en el servidor) usando algo como myServerSideObjectInstanceName.StudentName (o lo que sea).

Cuestiones relacionadas