2011-11-26 19 views
8

Tengo una serie de cadenas en JS. Todos los miembros son en realidad números.
Mi controlador tiene un parámetro int [].JS int matriz a controlador MVC3

lo envío de jQuery:

$.ajax({url: someUrl, data: {ids : JSON.stringify(id_array) }, ...) 

y recibo usando

public ActionResult MyAction(int[] ids) { ... 

El parámetro no se llene, he comprobado, la Request.Form["ids"] contiene "[\"25\",\"26\"]", la cadena Representación de la matriz JSON ¿Hay alguna manera de hacer esto automáticamente sin una gran cantidad de int análisis?

Respuesta

11

¿No han intentado stringifying la matriz y dejar que la unión modelo por defecto de MVC hacer la magia

$.ajax({url: someUrl, data: {ids : id_array }, ...) 

Estoy bastante seguro de .NET MVC verá la matriz y ver que es una matriz de enteros y asignarla a su matriz de INT correctamente

+0

sí, Request.Form [ "ids []"] tendrán el valor "25,26", int [ ] todavía no vinculante. – TDaver

+11

@TDaver necesita establecer la propiedad "tradicional" .ajax en true para que la serialización de arreglos superficiales funcione correctamente de acuerdo con http://api.jquery.com/jQuery.param/ así como –

+1

, todo lo que me faltaba era la bandera tradicional. Gracias – TDaver

0

es necesario utilizar

$.ajax({ 
    url: someUrl, 
    data: id_array.map(function(item){ return {name:'ids',value:item}; }) 
}) 

Eso se debe a que con el fin de recibir una lista en el backend, es necesario enviar el formulario de los datos ids=3&ids=5&ids=1&ids=7


Para las versiones de IE que no apoyan el uso .map

function arrayToParamObject(name,array){ 
    var obj = []; 
    for (var i = 0, len = array.length; i< len; i++){ 
     obj.push({name: name, value: array[i] }); 
    } 
    return obj; 
} 

y lo utilizan

$.ajax({ 
    url: someUrl, 
    data: arrayToParamObject('ids', id_array) 
}) 
4

Usted puede hacer esto de dos maneras diferentes

1. Uso $. ajax para publicar datos en su acción

$.ajax({ 
    url: '/myController/myAction', 
    dataType: 'json', 
    type: 'POST', 
    contentType: 'application/json; charset=utf-8', 
    traditional: true, 
    data: $.toJSON(json), 
    success: function (data, textStatus, jqXHR) { 
    ... 
    } 
}); 

Su acción debe ser similar a éste

public class myController 
{ 
    [HttpPost] 
    public ActionResult myAction(List<int> json) 
    { 
     .... 
    } 
} 

2. Uso $ .post para publicar sus datos

$.post(
    '/myController/myAction', 
    { json: $.toJSON(products) }, 
    function (data) { 
    ... 
}); 

en su acción que debería deserializar la cadena JSON

public class myController 
    { 
    public ActionResult myAction(string json) 
    { 
     JavaScriptSerializer serializer = new JavaScriptSerializer(); 
     List<int> list = serializer.Deserialize<List<int>>(json); 
    } 
} 

Es necesario descargar e incluir jquery.json-2.2.min.js a su código.

http://code.google.com/p/jquery-json/downloads/detail?name=jquery.json-2.2.min.js

+0

esto es mucho menos automático de lo que estaba buscando ... – TDaver

11

Para MVC3 tendrá que configurar jQuery para usar, serialización tradicional "superficial" .. Ver here.

del lado del cliente petición AJAX:

jQuery.ajaxSettings.traditional = true; //enable "shallow" serialisation globally 
$.get("someUrl", {ids : id_array }); 

Acción Método:

public ActionResult MyAction(string[] ids) { ... } 
+0

¡Gracias! Sin embargo, aceptaré a Keith.Abramo, ya que fue el primero – TDaver

Cuestiones relacionadas