2009-10-09 9 views
7

Ich veröffentliche Daten zu einem MVC-Controller, und ich bin versucht, Staat als auch für die Parallelität zu halten. Ich poste gerade eine JSON-Anfrage zurück, wäre aber offen für praktikable Alternativen?

Ich bin schon ein Name/Wert-Sammlung mit dem folgenden Befehl Posting:

$.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 
}); 

Ich habe auch eine (verschlüsselte) Array von IDs und Zeitstempel, die ich zurück, damit der Server übergeben wollen entschlüsseln kann, Überprüfen Sie anschließend, ob die Daten noch frisch sind, bevor sie gespeichert werden.

Es ist sehr wichtig, dass das Datenobjekt getrennt ist und kein untergeordnetes Element des einen oder des anderen oder in einem Wrapper-Array ist (wegen reflektorischer Deserialisierung am Serverende). Es ist auch wichtig zu beachten, dass ich einreichen diese asynchron und nicht als eine Form tun wollen.

Meine Frage ist: Gibt es eine Möglichkeit, zurück 2 JSON-Objekte veröffentlichen können ‚application/json‘ als Inhaltstyp verwenden?

Meine andere Frage ist: Gibt es eine bessere/andere Art, wie ich dies tun könnte?

danke im voraus!

AKTUALISIEREN: Ich löste mein Problem, indem ich den contentType-Parameter auf den Standardwert änderte und stattdessen die stringifizierten AJAX-Daten als separate benannte Parameter in den Querystring schickte.

Wenn Sie content verwenden: ‚application/json; charset = utf-8 ', das schiebt die Daten in den Körper der Anfrage und nicht in die Querystring. Mein neues $ Schnipsel() Post sieht nun wie folgt aus:

$.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 
}); 

Diese Frage wirklich erhob sich wegen meiner Unerfahrenheit mit dieser Art von Datenoperation, und ich hoffe, dass jemand für diese in die Zukunft könnte über diese stolpern.

danke!

Dan

+0

Vielen Dank für Ihr Feedback Jungs! Ich schätze die Bemühungen sehr, die Sie unternommen haben, um mir zu helfen, dies zu lösen. Eines meiner Ziele war es, die Daten in einem Wrapper-Array zu vermeiden, was meiner Meinung nach das Einzige ist, das Sie mit einem Inhaltstyp wie 'application/json; charset = utf-8 '. Ich habe eine Lösung dafür gefunden, die ich als Ergänzung zu meiner Frage veröffentlichen werde. – Evildonald

+0

Nur zu Ihrer Information: 'data:" RoundingData = "+ $ .toJSON (Daten) +" & StateData = "+ $ .toJSON (stateData)' und '{RoundingData: $. ToJSON (Daten), StateData: $ .toJSON (stateData) 'werden von jQuery auf die gleiche Weise interpretiert. Nun, tatsächlich wird Ihre Abfrage-Zeichenfolge tatsächlich in das Objekt im großen Schema der Dinge für die tatsächliche XHR konvertiert werden. Wenn Sie einen GET-Aufruf ausführen und die Abfragezeichenfolge der tatsächlichen URL hinzufügen, können Sie dieses Problem vermeiden, aber ich sehe nicht, warum es wichtig wäre (ich bin sicher, dass Sie einen guten Grund haben). Und natürlich ist GET sowieso kein semantisch korrektes HTTP. /schimpfen. – KyleFarris

Antwort

15

Soweit ich weiß, gibt es keinen Weg zurück zwei völlig verschiedene JSON-Objekte zu senden, die keine Kinder von einem Elternteil JSON-Objekt sind und jQuery es entschlüsseln, damit Sie die .ajax() Methode. Sie könnten, denke ich, mit zwei JSON-Objekten als Strings antworten und dann eine externe JSON-Bibliothek verwenden, um die Strings in ein Javascript-Objekt auszuwerten.

Beantwortet das Ihre Frage?

Ooops: Sie fragen zu veröffentlichen zwei verschiedene JSON-Objekte auf dem Controller von jquery ..., nicht wahr? Meine schlechte ... Ja, Sie können das tun ... Nur diese Zeile:

data: $.toJSON(data), 

zu:

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

Sorry über die Verwechslung.

+1

+1 zu Ihnen für die Antwort zuerst. Vielen Dank. – Evildonald

+0

Sicher, kein Problem. – KyleFarris

1

Wenn ich Sie richtig verstehe, funktional zu sprechen, wollen Sie

object 1, 
object 2 

die

[ 
    object 1, 
    object 2 
] 

Der einzige Unterschied zum Senden äquivalent senden ist, dass das Array im ersteren Fall ist implizit, während in letzterem ist es explizit. Es ist immer noch so oder so, aber wenn Sie mehrere Objekte in JSON senden möchten, müssen Sie den expliziten Ansatz verwenden.

Das Wrapping der beiden Datenobjekte in einem Array ist also die ideale Wahl, aber wenn Ihr Server-Code dies nicht unterstützt, benötigen Sie eine Alternative. Die einzig mögliche Methode, die ich sehen kann, dies zu tun wäre in einem anderen Objekt sowohl Daten als Objekte zu setzen, wie folgt aus:

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

Und dann senden Sie data entlang durch die AJAX-Aufruf.

Ich würde so weit gehen zu sagen, dass das Problem nicht Ihre Vorgehensweise, sondern die JSON-Behandlung auf der Empfängerseite ist.

0

Ich glaube, Sie so etwas tun kann:

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

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

// serializer 

JSON2.stringify(data); 
1

Sie dies in asp.net auf einfache Art und Weise tun, wenn u nur mehrere Daten senden möchten

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

WEBMETHOD Dies ist eine Antwort nach einer sehr langen Zeit, aber kann Ihnen für jede zukünftige Referenz hilfreich sein.

Ich schlage vor, Sie lesen this stackoverflow answer, die Ihr Problem direkt anspricht.