2009-07-06 11 views
4

Je suis heureux sérialisation avec javascript objets en utilisant JSONTransmettre une chaîne JSON complexe à 1 paramètre webmethod dans C# - desearialize en objet (json.net)?

  JSON.stringify 

et envoi le long de mon webmethod « statique » en C#/asp.net et que enought arrive .. J'ai besoin le nombre correct de paramètres donc Si mon objet json a "startDate", "endDate", "reserve" alors ma méthode web a besoin de ces paramètres.

"Fondamentalement, avec mon objet de commande que j'ai, j'ai un certain nombre de paramètres sur cet objet, donc je devrais utiliser le même numéro sur la webmethod - c'est un peu brouillon ??" - Je vais vous expliquer

J'ai un objet "Order" assez complexe en javascript et je souhaite le sérialiser en utilisant stringify et l'envoyer à ma webmethod mais je ne veux pas spécifier tous les paramètres. ?

J'espérais quelque chose comme ça sur mon webmethod

  public static bool MakeReservation(object order) 

Puis dans mon webmethod je n'ai que 1 paramètre, mais je peux alors desearilize à un véritable objet C# en utilisant JSON.NET. Je l'ai essayé comme ceci envoyant le json à travers mais parce qu'il y a seulement 1 paramètre sur mon webmethod son échec.

En fait ce que je suis en train de dire si je que je veux continuer à utiliser mon webmethod mais je ne veux pas avoir à faire préciser 15 paramètres sur la webmethod

Je veux JSON - cordes pour arriver dans ma webmethod et puis je peux le décomposer sur le serveur.

Est-ce possible?

Voici comment j'envoie actuellement mon JSON au serveur (webmethod) en utilisant 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

J'ai essayé ceci mais c'est comme si je juste JSON l'objet pas le STRING var jsonData1 = JSONNew.stringify (orderObject); var myString = jsonData1; var jsonData = JSONNew.stringify (myString); –

+0

pourquoi changez-vous le contentType? Que se passe-t-il lorsque vous enlevez cela – redsquare

+0

autant que je sache que vous en avez besoin dans .. le type de contenu ?? C'est ce que disent la plupart des tutoriels ... J'ai réussi à le faire ... mais je ne sais pas si c'est une bonne pratique ou ... fondamentalement je l'ai fait var jsonString = JSONNew.stringify (orderObject); var jsonObject = new Object(); jsonObject.jsonString = jsonString; var jsonData = JSONNew.stringify (jsonObject); Maintenant, je n'ai besoin que d'un paramètre sur la webmethod qui est une chaîne et la chaîne json y entre .. Je n'ai aucune idée si cela fonctionne encore .. mais au moins je rentre dans la webmethod avec jsonstring –

Répondre

9

Si vous essayez d'envoyer un objet qui ressemble à ceci:

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

il va essayer et mappez endDate et startDate aux paramètres correspondants dans votre méthode web. Puisque vous ne souhaitez que d'accepter une seule méthode, je pense que vous pouvez vous en sortir avec elle en soumettant les éléments suivants:

JSON.stringify({ order: orderObject }); 

qu'il pourrait essayer raisonnablement d'attribuer une valeur au paramètre « commander » de votre webmethod. A défaut, soumettre

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

puis désérialisation à l'aide JSON.NET devrait certainement travailler, mais il est plus laid, alors essayez le premier exemple d'abord. C'est mon meilleur coup.

4

C'est possible.Je ne suis pas si bon à expliquer des choses, je vais vous montrer mon exemple de code:

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

code C# derrière

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; 
} 

Mon code n'est pas belle mais j'espère que vous en aurez compris le sens.

1

J'ai récemment vécu ce même problème avec un objet complexe JSON que je voulais déseriliser dans mon contrôleur. La seule différence est que j'utilisais le plugin .toJSON sur le client au lieu de .stringify.

La réponse facile:

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

Maintenant, comme une solution à plus long terme, nous avons créé une coutume ActionFilterAttribute pour traiter ces cas. Il détecte les paramètres JSON et gère la désérialisation de l'objet et le mappage à l'action. Vous pouvez vouloir faire de même.