Wie übergibt man ein komplexes Modell vom Client zum Server?

8

Ich habe einige Daten "Foo", die ich vom Browser zum Server weiterleiten und die vorhergesagten Statistiken basierend auf den in foo enthaltenen Informationen abrufen möchte.

%Vor%

Ich habe einen vorhergesagten Statistik-Controller erstellt und eine Methode erhalten, die ein Argument von Foo verwendet.

%Vor%

Wenn ich einen Haltepunkt bei der Get-Methode halte, sehe ich, dass das Foo-Objekt immer null ist. Es werden keine Fehler von der Webapi-Ablaufverfolgung ausgelöst, die nur die folgenden Zeilen protokolliert.

%Vor%

Ich habe kein Problem, die Daten per Post an den Foo-Controller zu senden, um das Foo-Objekt auf dem Server zu erstellen, damit ich sagen kann, dass an der von json erstellten Clientseite nichts falsch ist.

Beim Suchen in fiddler sieht das resultierende Get wie folgt aus: jsondata ist das Objekt foo.

%Vor%

Ist das überhaupt möglich oder mache ich das alles falsch?

Danke Neil

BEARBEITEN: Ich fühle mich, als ob ich fast mit dem folgenden

arbeiten würde %Vor%

Das Objekt foo kam gut zurück, aber die Eigenschaften von Foo wurden nicht richtig ausgefüllt.

In der Zwischenzeit habe ich auf einen POST mit fast identischen Daten zurückgegriffen, indem ich einfach "foo=" weglege und das funktioniert ganz gut.

Ich bin mir nicht sicher, ob der POST oder das GET in diesem Fall verwendet werden sollte, aber das wäre interessant zu wissen.

Ich fand auch das Ссылка , was darauf hindeutet, dass Sie keinen Body an eine GET-Anfrage mit jquery anhängen können POST ist wahrscheinlich die einzig sinnvolle Option

    
Neil 02.08.2012, 09:00
quelle

1 Antwort

6

Sie sind fast dahin gekommen:)

Wenn Sie [FromUri] verwenden (das Sie für 'komplexe' Objekte verwenden müssen, weil Web API 'komplexe Objekte' standardmäßig nicht bindet, wird immer versucht, sie aus dem Body zu deserialisieren), die Sie nicht benötigen Übergeben Sie param= im Uri - übergeben Sie einfach die Elemente des Werts als Abfragezeichenfolgenparameter. Das ist 'member1=value&member2=value' - wobei member1 und member2 Mitglieder von Foo sind.

Beachten Sie, dass es in jQuery keinen "Fehler" gibt - während die HTTP-Spezifikation einen Anfragetext nicht verbietet, ist es wahrscheinlich, dass der Browser das tut (und wenn das der Fall ist, kann jQuery ihn nicht senden), und es ist mehr als wahrscheinlich, dass ein Server es sowieso nie lesen wird. Es ist einfach nicht akzeptierte Praxis. Es hat auch interessante Probleme mit dem Zwischenspeichern, da ein Browser keine POST, PUT, DELETE usw. zwischenspeichert, aber GET zwischenspeichert, wenn die Antwortheader es nicht verbieten - das könnte schwerwiegende Nebenwirkungen für haben eine Client-Anwendung. Ich empfehle Ihnen, diese SO: HTTP GET mit Anfrage Körper für weitere Informationen und einige nützliche Links zu diesem Thema.

Wenn Sie jQuery verwenden, müssen Sie das Objekt auch nicht in JSON konvertieren. Übergeben Sie einfach das JavaScript-Objekt im data -Member der Optionen und jQuery verwandelt es in das richtige Format.

Oder sollte das sein, Web API versteht das Format das jQuery es als gibt.

    
Andras Zoltan 02.08.2012, 21:49
quelle