Pasando cadena JSON complejo a 1 parámetro WebMethod en c # - desearialize en objeto (json.net)?

StackOverflow https://stackoverflow.com/questions/1087928

Pregunta

He sido feliz con javascript serializar objetos en JSON utilizando

         JSON.stringify

Y enviando junto a mi WebMethod "estática" en C # / asp.net y seguro enought llega .. Necesito el número correcto de parámetros por lo tanto, si mi objeto JSON tiene "startDate", "endDate", "reserva", entonces mi WebMethod necesita estos como parámetros.

"Básicamente con mi pedido objeto que tengo, tengo una serie de parámetros de este objeto por lo que tendría que utilizar el mismo número en el WebMethod - esto es un poco desordenado ??" - Voy a explicar

Tengo un objeto bastante complejo "orden" en javascript y deseo serializarlo usando stringify y enviarlo junto a mi WebMethod pero yo no quiero especificar todos los parámetros ¿Hay una manera alrededor de esto?

Me esperaba algo como esto en mi WebMethod

           public static bool MakeReservation(object order)

A continuación, en mi WebMethod sólo tengo 1 parámetro pero yo entonces puedo desearilize a un cierto c # objeto utilizando JSON.NET. Lo he probado esta manera enviar el JSON a través de pero porque sólo hay 1 parámetro en mi WebMethod su defecto.

Básicamente lo que estoy tratando de decir si lo que quiero seguir usando mi WebMethod pero no quiero tener que hacer especificar 15 parámetros en el WebMethod

Quiero que el JSON - Cadena para llegar a mi WebMethod y entonces puedo descomponerla en el servidor

.

¿Es esto posible?

Así es como actualmente estoy enviando mi JSON al servidor (WebMethod) usando 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
    });
¿Fue útil?

Solución

Si intenta enviar un objeto que se parece a esto:

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

se tratará de asignar endDate y startDate a los parámetros correspondientes en su WebMethod. Dado que sólo desea aceptar un único método, sospecho que puede salirse con la suya mediante la presentación de los siguientes:

JSON.stringify({ order: orderObject });

¿Qué podría razonablemente tratar de asignar como un valor para el parámetro 'orden' de su WebMethod. De no ser así, la presentación

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

y luego deserializar usando JSON.NET definitivamente debe trabajar, pero es más feo, a fin de tratar el primer ejemplo en primer lugar. Eso es lo mejor de mí.

Otros consejos

Es posible. No soy tan bueno para explicar las cosas, yo sólo voy a mostrar mi código de ejemplo:

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 # Código detrás

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

Mi código no es tan hermosa, pero espero que se obtiene el significado de la misma.

Hace poco fui a través de este mismo problema con un objeto JSON Complexe quería deserilize en mi controlador. La única diferencia es que yo estaba usando el plugin .toJSON en el cliente en lugar de .stringify.

La respuesta fácil:

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

Ahora, como una solución a largo plazo que crearon una costumbre ActionFilterAttribute para manejar estos casos. Detecta los parámetros JSON y manijas deserilizing el objeto y la cartografía de la acción. Es posible que desee ver en hacer lo mismo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top