2012-03-20 5 views
6

tengo mi matriz poblada de este modo:Pase la lista de entradas de JavaScript a C# - Obtengo la lista, pero está vacía; ¿los datos del formulario no están estructurados correctamente?

lado del servidor
updateLabels: function() { 
    var diagrams = _stage.diagramLayer.getChildren(); 

    var componentIDs = new Array(); 

    for (var index = 0; index < diagrams.length; index++) { 
     componentIDs.push(diagrams[index].componentID); 
    } 

    var self = this; 
    $.ajax({ 
     url: '../PlanView/UpdateDiagrams', 
     type: 'POST', 
     data: { ComponentIDs: JSON.stringify(componentIDs), RackInfo: $('#RackInfoSelect').val() }, 
     success: function (data) { 
      console.log('success'); 
     }, 
     error: function() { 
      console.log("error"); 
     } 
    }); 
    }, 

que tiene este método:

[CompressionFilterAttribute] 
public JsonResult UpdateDiagrams(List<int> componentIDs, string rackInfo) 
{ 
    List<object> diagramInformation = new List<object>(componentIDs.Count()); 
} 

mis datos a medida que se pasa a través de la red:

ComponentIDs:[74,445,732,351,348,347,1123,599,600,1053,350,601,602,603,332,99,877,919,349,348,347,347,349,348] 
RackInfo:Equipment Weight 

I obtener con éxito RackInfo, si cambio UpdateDiagrams para esperar List<string>, entonces obtengo una lista con un elemento, toda la cadena ComponentIDs.

¿Qué estoy haciendo incorrectamente aquí?

EDITAR: Estoy trabajando con MVC3. Debería poder aprovechar algún tipo de deserialización automática cuando pasé a mi controlador, no estoy seguro de cómo.

SOLUCIÓN: La solución fue envolver mi objeto de datos en JSON.stringify, no solo en ID de componente. Aunque puedo obtener la variable RackInfo del lado del servidor sin convertirla a JSON.

+0

Tal vez 'componentIDs.push (parseInt (diagramas [index] .componentID)); '? – MiMo

Respuesta

4

Si desea que sus datos publicados estén en formato JSON, intente algo como esto. MVC debería poder deserializarlo automáticamente en el lado del servidor.

$.ajax({ 
    url: '../PlanView/UpdateDiagrams', 
    type: 'POST', 
    contentType: 'application/json', 
    data: JSON.stringify({ 
     componentIDs: componentIDs, 
     rackInfo: $('#RackInfoSelect').val() 
    }), 
    success: function (data) { 
     console.log('success'); 
    }, 
    error: function() { 
     console.log("error"); 
    } 
}); 

(soy incapaz de probarlo en el momento, pero es de esperar que debería estar en la dirección correcta, incluso si no es completamente libre de errores.)

+0

Esto salió directamente de la caja como un campeón. Me pregunto por qué no siempre necesito llamar a JSON.stringify. –

+0

Este código se romperá cuando se agregue algo diferente a un int en la cadena por accidente. Debe desinfectar TODAS sus entradas y analizar sus valores en lugar de confiar en procesos automáticos que fallen cuando menos lo espere, eventualmente. Y, también hace que tu aplicación sea menos segura. ¿Todo esto para evitar una línea de código? Código de calidad! – frenchie

1

Está enviando una cadena que contiene una lista de cadenas. Cuando llega al servidor, la cadena necesita ser deserializada.

[CompressionFilterAttribute] 
public JsonResult UpdateDiagrams(string ListcomponentIDs, string rackInfo) 
{ 
    List<int> componentIDs = (from string s in ListcomponentIDs.Split(',') 
          select Convert.ToInt32(s)).ToList<int>(); 
} 

Cambié el parámetro a una cadena. Cuando lo tenía como una lista de int, era una lista vacía ya que no estaba pasando una lista de enteros.

Además, en la JS, que no es necesario para serializar la matriz, simplemente llame a ToString en él:

data: { ComponentIDs: componentIDs.toString() ... 

modo que los datos no incluye los corchetes [].

Dejarme saber cómo funciona esto.

+0

¿Cómo puedo pasar una lista de entradas que no necesitaría/explícitamente/deserializar, entonces? Sé que se puede hacer; he visto ejemplos de que se está haciendo con objetos más complejos que los ints. –

+0

El objetivo de json IS es serializar/deserializar los datos. Ver arriba, simplifiqué un poco el código. – frenchie

+0

Y lo que estoy diciendo es que se supone que MVC debe hacer esto por mí. Ver esto: http://uliasz.com/2010/07/passing-list-as-parameter-from-ajax-request-to-mvc-controller/ –

0

No he podido probarlo con ASP.NET MVC, pero si elimina el JSON.stringify todo debería funcionar correctamente. Este es el formulario de datos sin JSON.stringify:

  • ComponentIDs []: 10
  • ComponentIDs []: 20
  • ComponentIDs []: 30
  • RackInfo: Peso del equipo

Esa es la forma normal en que se publica una matriz en el servidor.

Con JSON.stringify:

  • ComponentIDs: [10,20,30]
  • RackInfo: Rackinfo

La llamada a JSON.stringify convierte la matriz a la cadena "[ 10, 20, 30] "por lo que está publicando una cadena en el controlador.

Cuestiones relacionadas