2009-07-06 10 views
4

Ich habe mit JavaScript-Objekte in JSON glücklich Serialisierung daher mitÜbergeben der komplexen JSON-Zeichenfolge an 1 Parameter webmethod in C# - desearialize in Objekt (json.net)?

  JSON.stringify 

und Senden entlang meiner „statisch“ Webmethod in C#/asp.net und enought sicher, es kommt .. Ich muss die richtige Anzahl von Parametern Wenn mein Json-Objekt "startDate", "endDate", "reserve" hat, benötigt meine Webmethode diese als Parameter.

"Grundsätzlich mit meinem Auftragsobjekt, das ich habe, habe ich eine Reihe von Parametern auf diesem Objekt, so dass ich die gleiche Nummer in der Webmethode verwenden müsste - das ist ein bisschen unordentlich ??" - Ich werde

erklären Ich habe eine ziemlich komplexe „Order“ Objekt in Javascript und wollen es serialisiert mit stringify und es entlang meiner Webmethod schicken, aber ich will nicht alle Parameter angeben, gibt es eine Möglichkeit, diese Runde ?

Ich hatte gehofft, für so etwas auf meinem Webmethod

  public static bool MakeReservation(object order) 

Da ist in meinem Webmethod ich habe nur 1 Parameter aber ich kann diese dann desearilize zu einem echten Objekt C# JSON.NET. Ich habe es versucht wie das Senden der JSON über, aber weil es nur 1 Parameter auf meiner Webmethode ist fehlgeschlagen.

Im Grunde, was ich bin versucht zu sagen, wenn ich, dass ich möchte, dass meine Webmethod weiterhin zu verwenden, aber ich will nicht 15 Parameter zu tun zu haben, geben Sie auf dem Webmethod

ich die JSON wollen - String ankommen in meine Webmethode und dann kann ich es auf dem Server zerlegen.

Ist das möglich?

Hier ist, wie ich bin derzeit meine JSON an den Server (Webmethod) sendet mit Jquery

var jsonData = JSONNew.stringify(orderObject); 

    $.ajax({ 
     type: "POST", 
     url: "MyService.aspx/DoReservation", 
     data: jsonData, 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: function(msg) { 
      success = true; 
     }, 
     error: function(msg) { 
      success = false; 
     }, 
     async: false 
    }); 
+0

Ich habe versucht, aber es ist, als ob ich nur JSON das Objekt nicht die STRING var jsonData1 = JSONNew.stringify (orderObject); var myString = jsonData1; var jsonData = JSONNeuer.stringify (myString); –

+0

Warum ändern Sie den ContentType? was passiert, wenn Sie das herausnehmen – redsquare

+0

so weit ich weiß, dass Sie das brauchen .. der Inhaltstyp? Das ist, was die meisten Tutorials sagen ... Ich habe es geschafft ... aber ich habe keine Ahnung, ob es eine gute Übung ist oder ?? im Grunde habe ich das getan var jsonString = JSONNew.stringify (orderObject); var jsonObject = neues Objekt(); jsonObject.jsonString = jsonString; var jsonData = JSONNeuer.stringify (jsonObject); Jetzt brauche ich nur 1 Parameter auf der Webmethode, die eine Zeichenfolge ist und die JSON-Zeichenfolge tritt ein .. Ich habe keine Ahnung, ob es noch funktioniert .. aber zumindest ich gehe in die Webmethode mit JSonstring –

Antwort

9

Wenn Sie versuchen, ein Objekt zu senden, die wie folgt aussieht:

JSON.stringify({ endDate: new Date(2009, 10, 10), startDate: new Date() }); 

wird es versuchen, und ordnen Sie endDate und startDate den entsprechenden Parametern in Ihrer Webmethode zu. Da Sie nur eine einzige Methode akzeptieren wollen, vermuten, dass ich Sie mit ihm durch Vorlage des wegkommen kann folgende:

JSON.stringify({ order: orderObject }); 

Welche es versuchen könnte vernünftigerweise als Wert der ‚Ordnung‘ Parameter Ihrer Webmethod zuzuweisen. Gelingt das nicht,

JSON.stringify({ order: JSON.stringify(orderObject) }); 

einreichen und Deserialisieren es dann auf jeden Fall funktionieren JSON.NET verwenden sollte, aber es ist hässlicher, so versuchen Sie zuerst das erste Beispiel. Das ist mein bester Schuss.

4

Es ist möglich.Ich bin nicht so gut in Sachen erklären, werde ich Ihnen mein Beispielcode nur zeigen:

Javascript:

var Order = function(name, orderid, price) { 
this.name = name; 
this.orderid = orderid; 
this.price = price;} 

var pagePath = window.location.pathname; 

function setOrder() { 
var jsOrder = new Order("Smith", 32, 150); 
var jsonText = JSON.stringify({ order: jsOrder }); 
$.ajax({ 
    type: "POST", 
    url: pagePath + "/SetOrder", 
    contentType: "application/json; charset=utf-8", 
    data: jsonText, 
    dataType: "json", 
    success: function(response) { 
     alert("wohoo"); 
    }, 
    error: function(msg) { alert(msg); } 
}); 
} 

C# -Code hinter

public class Order 
{ 
public string name { get; set; } 
public int orderid { get; set; } 
public int price { get; set; } 
} 

[WebMethod] 
public static void SetOrder(object order) 
{ 
    Order ord = GetOrder(order); 
    Console.WriteLine(ord.name +","+ord.price+","+ord.orderid);   
} 
public static Order GetOrder(object order) 
{ 
    Order ord = new Order(); 
    Dictionary<string,object> tmp = (Dictionary<string,object>) order; 
    object name = null; 
    object price = null; 
    object orderid = null; 
    tmp.TryGetValue("name", out name); 
    tmp.TryGetValue("price", out price); 
    tmp.TryGetValue("orderid", out orderid); 
    ord.name = name.ToString(); 
    ord.price = (int)price; 
    ord.orderid = (int) orderid; 
    return ord; 
} 

Mein Code nicht so schön ist aber ich hoffe, du verstehst es.

1

Ich habe gerade dieses Problem mit einem komplexen JSON-Objekt durchsucht, das ich in meinem Controller deserilisieren wollte. Der einzige Unterschied ist, dass ich das .toJSON-Plugin auf dem Client anstelle von .stringify verwendet habe.

Die einfache Antwort:

public static bool MakeReservation(string orderJSON) 
{ 
    var serializer = new JavaScriptSerializer(); 
    var order = serializer.Deserialize<Order>(orderJSON); 
} 

nun als längerfristige Lösung haben wir eine benutzerdefinierte Action diese Fälle zu behandeln. Es erkennt die JSON-Parameter und behandelt die Deserilisierung des Objekts und die Zuordnung zur Aktion. Vielleicht möchten Sie das Gleiche tun.

Verwandte Themen