2009-06-30 11 views
16

Ho avuto problemi con questo codice che aveva trascorso le ultime 3 ore a scavare intorno e cercando di trovare una risposta. Come io non ha avuto successo, mi limiterò a pubblicare il codice e chiedo che tipo di parametri dovrei avere il mio servizio web per gestire questa richiesta:ASP.NET: problema param jQuery AJAX 'dati'

var args = [{ key: 'myId', value: 'myValue' }, { key: 'myOtherId', value: 'myOtherValue'}]; 
var dataToSend = { name: 'fooId', value: 'fooValue', args: args }; 
$.ajax({ 
type: 'POST', 
url: 'fooURL', 
data: dataToSend, 
contentType: 'application/json; charset=utf-8', 
dataType: 'json', 
success: OnSuccess, 
error: OnError 
}); 

Ora, che tipo di firma avrei dovuto essere in grado ottenere il mio "dataToSend"?

ho provato:

[WebMethod, ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
public string Foo(string name, object value, List<Args> args) 
{ 
    return "OK"; 
} 

public class Args 
{ 
    public string key { get; set; } 
    public object value { get; set; } 
} 

e

[WebMethod, ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
public string Foo(string name, object value, object[] args) 
{ 
    return "OK"; 
} 

e anche

[WebMethod, ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
public string Foo(dataToSend dataToSend) 
{ 
    return "OK"; 
} 

public class dataToSend 
{ 
    public string name { get; set; } 
    public object value { get; set; } 
    public List<Args> args = new List<Args>(); 

} 
public class Args 
{ 
    public string key { get; set; } 
    public object value { get; set; } 
} 

risposta

22

Prova a passare i dati come una stringa, non un oggetto, vale a dire:

 
$.ajax({ 
    ... 
    data : '{ a: 2, b: 3 }', 
    ... 
}); 

Il ragionamento per questo è che se si specifica un oggetto come dati poi jQuery serializza i dati utilizzando il formato stringa di ricerca, mentre il il server si aspetta il formato JSON direttamente.

Questo accade nonostante dicendo jQuery per usare JSON come il tipo di dati - sembra riguardare solo il risultato, non la richiesta payload inviata al server.

Tutto il resto che hai lì sembra corretto per me.

+3

Abbastanza sicuro che Sam lo abbia qui. Controlla http://elegantcode.com/2009/02/21/javascript-arrays-via-jquery-ajax-to-an-aspnet-webmethod/ per maggiori informazioni. Supponendo che la stringa lo risolva, penso che sarà la prima sintassi. –

0

Se si lavora con JSON abilitati .NET WebServices/WebMethods ... i miei consigli sono:

  • Fare molta attenzione alla configurazione di web.config. Usalo per abilitare grandi parametri, metodo POST e JSON.

  • utilizzare un quadro di per gestire Object serializzazione e deserializzazione. Consiglierei NewtonSoft's Json.NET.

Non credo ASP.NET automagicamente fanno per voi, i vostri parametri sono sempre stringhe. Dovresti prendere le stringhe, deserializzarle e trasformarle in una serie di oggetti.

+0

penso di sì. Controlla questo (anche se è MVC lo stesso concetto dovrebbe essere applicato per i moduli web): http://blogger.forgottenskies.com/?p=243 –

2

Anche se questo è un posto più vecchio ho pensato di contribuire. Ho inviato un array associativo con la stessa idea e il post accettato, trovo più facile scrivere.

Javascript

postData[0] = 'data!'; 
postData[1] = 'moar data!'; 
postData[2] = 'and some data'; 

$.ajax({ 
    type: 'POST', 
    url: 'postUrl', 
    data: { data: postData }, 
}); 

PHP

$data = $_POST['data'][0]; 
$moar_data = $_POST['data'][1]; 
$and_some_data = $_POST['data'][2];