2009-10-09 11 views
7

sto inviando i dati a un controller MVC e sto cercando di mantenere lo stato, nonché per la concorrenza ottimistica. Sto attualmente postando una richiesta JSON, ma sarebbe aperta a alternative praticabili?

Sono già postando una collezione nome/valore con il seguente comando:

$.ajax({ 
    url: g_appPath + "/Rounding.aspx/Round/" + $("#OfferId").val(), 
    type: 'POST', 
    dataType: 'html', 
    data: $.toJSON(data), // <-- data = name/value array 
    contentType: 'application/json; charset=utf-8', 
    beforeSend: doSubmitBeforeSend, 
    complete: doSubmitComplete, 
    success: doSubmitSuccess 
}); 

Ho anche un (criptato) array di id e timestamp che voglio passare di nuovo in modo che il server possa decifrarlo, quindi convalidare che i dati siano ancora freschi prima di salvarli.

È molto importante che l'oggetto dati sia separato e non figlio dell'uno o dell'altro o in un array di wrapper (a causa della deserializzazione riflessa sul lato server). E 'anche importante notare che io voglio fare questo in modo asincrono e non come una forma di invio.

La mia domanda è: C'è un modo posso pubblicare di nuovo gli oggetti JSON 2 usando 'application/json' come il tipo di contenuto?

La mia altra domanda è: Esiste una migliore/altro modo potrei fare questo?

grazie in anticipo!

UPDATE: Ho risolto il problema, modificando il parametro contentType su predefinito e inviando invece i dati ajax stringificati come parametri denominati separati nel querystring.

Quando si utilizza contentType: 'application/json; charset = utf-8 ', questo inserisce i dati nel corpo della richiesta, piuttosto che nella querystring. Il mio nuovo $ .ajax() posta appare come segue:

$.ajax({ 
    url: g_appPath + "/Rounding.aspx/Round/" + $("#OfferId").val(), 
    type: 'POST', 
    dataType: 'html', 
    data: "RoundingData=" + $.toJSON(data) + "&StateData=" + $.toJSON(stateData), 
    // --removed! contentType: 'application/json; charset=utf-8', 
    beforeSend: doSubmitBeforeSend, 
    complete: doSubmitComplete, 
    success: doSubmitSuccess 
}); 

Questa domanda veramente sorto a causa della mia inesperienza con questo tipo di operazione di dati, e spero che qualcuno alla ricerca di questo in futuro potrebbe incappare in questo.

grazie!

Dan

+0

Grazie per i vostri ragazzi feedback! Apprezzo molto lo sforzo che hai fatto per aiutarmi a risolvere questo problema. Uno dei miei obiettivi era quello di evitare di avere i dati in un array involucro, che credo è forse l'unica era che si può fare con un tipo di contenuto di 'application/json; charset = utf-8' . Ho elaborato una soluzione a questo che pubblicherò come appendice alla mia domanda. – Evildonald

+0

Solo per FYI: 'data:" RoundingData = "+ $ .toJSON (data) +" & StateData = "+ $ .toJSON (stateData)' e '{RoundingData: $. ToJSON (dati), StateData: $ .toJSON (stateData) 'sono interpretati allo stesso modo da jquery. Bene, in realtà la stringa di query verrà effettivamente convertita nell'oggetto nel grande schema di cose per l'XHR effettivo. Effettuando una chiamata GET e aggiungendo la stringa di query all'URL actualy, è possibile evitare questo problema, ma non vedo perché sarebbe importante (sono sicuro che hai una buona ragione). E, ovviamente, GET non è comunque HTTP semanticamente corretto./Rant. – KyleFarris

risposta

15

Per quanto ne so, non c'è modo di mandare indietro due completamente diversi oggetti JSON che non sono figli di un unico oggetto JSON genitore e avere jQuery decodificarlo per voi utilizzando il metodo .ajax(). Si potrebbe, suppongo, rispondere con due oggetti JSON come stringhe e quindi utilizzare una libreria JSON esterna per valutare le stringhe in un oggetto Javascript.

Questo risponde alla tua domanda?

Ops: Stai chiedendo di inviare due oggetti JSON distinti per il controller da jQuery ..., giusto? Il mio male ... Sì, si può fare che ... Basta cambiare questa linea:

data: $.toJSON(data), 

a:

data: { json_1:$.toJSON(data_1), json_2:$.toJSON(data_2) }, 

Ci scusiamo per la confusione.

+1

+1 a voi per aver risposto prima. Grazie. – Evildonald

+0

Certo, nessun problema. – KyleFarris

1

Se ho capito bene, parlare funzionale, si desidera inviare

object 1, 
object 2 

che equivale a inviare

[ 
    object 1, 
    object 2 
] 

L'unica differenza è che la matrice nel primo caso è implicito, mentre in quest'ultimo è esplicito. E 'ancora lì in entrambi i casi, ma se si desidera inviare più oggetti in JSON è necessario utilizzare l'approccio esplicito.

Quindi avvolgere i due oggetti dati in un array è davvero la scelta ideale, ma se il codice sever non sta per sostenere che avrete bisogno di un'alternativa. L'unico metodo possibile che posso vedere per farlo sarebbe quello di mettere entrambi gli oggetti di dati all'interno di un altro oggetto, in questo modo:

var data = {}; 
data[0] = data1; 
data[1] = data2; 

E poi inviare data lungo attraverso la chiamata AJAX.

Direi che il problema non è il tuo approccio, ma piuttosto la gestione JSON sul lato ricevente.

0

Penso che si possa fare qualcosa di simile:

var data = {}; 
var object1 = {}; 
var object2 = {}; 

data.object1 = object1;<br/> 
data.object2 = object2; 

// serializer 

JSON2.stringify(data); 
1

È possibile farlo in modo semplice in asp.net, se volete semplicemente per inviare più dati WebMethod

data: '{userName: "' + $("#<%=txtUserName.ClientID%>")[0].value + '",userName1: "' + $("#<%=TextBox1.ClientID%>")[0].value + '" }', 
0

Questa è una risposta dopo molto tempo, ma potrebbe esserti utile per qualsiasi riferimento futuro.

vi consiglio di leggere this stackoverflow answer che sta affrontando direttamente il problema.

Problemi correlati