2010-07-28 14 views
5

Estoy tratando de enviar una lista ordenable jquery de elementos a mi método MVC para el procesamiento de datos. Actualmente estoy tratando de enviarlo a través del siguiente código:¿Cómo se serializa una matriz JS para que Asp.net MVC pueda vincularla a una lista C#?

var data = {}; 
data.projectId = projectId; 
data.publishedSectionIds = $('#section_list').sortable('toArray'); 

// Perform the ajax 
$.ajax({ url: '/Project/Publish', 
    type: 'POST', 
    data: data, 
    success: function (result) { 
     alert(result.message); 
    } 
}); 

El problema con este código es que hace los parámetros POST aspecto:

projectId=2&publishedSectionIds[]=1&publishedSectionIds[]=2 

El problema con esto (como se puede ver por la solución a this question) es que MVC solo parece serializar en una lista si los parámetros de publicación do NOT tienen paréntesis.

¿Cómo puedo serializar la matriz de Javascript para que mi acción con un modelo de parámetro List<int> se vincule correctamente?


Editar: firma de la acción se ve así:

public ActionResult Publish(int projectId, List<int> publishedSectionIds) 
+0

¿Podemos ver su firma de acción? – Patricia

+0

Se agregó a la pregunta. – KallDrexx

+0

bien, mira mi respuesta, tengo dos acciones diferentes que funcionan maravillosamente :) – Patricia

Respuesta

3

intento de añadir la siguiente opción tradicional: la verdadera

por ejemplo

$.ajax({ url: '/Project/Publish', 
    type: 'POST', 
    data: data, 
    traditional: true, 
    success: function (result) { 
     alert(result.message); 
    } 
}); 

ver

A partir de jQuery 1.4, el método $ .param() serializa los objetos profundos recursivamente para acomodarse a los lenguajes y marcos de scripting modernos como PHP y Ruby on Rails. Puede desactivar esta funcionalidad globalmente configurando jQuery.ajaxSettings.traditional = true ;.

http://api.jquery.com/jQuery.param/

+0

No, eso no parece ayudar en absoluto. La cadena de consulta todavía tiene corchetes y ASp.net MVC aún no puede serializarla en el formato tradicional. La 'Lista publishedSectionIds' no es nula, pero tiene un recuento de – KallDrexx

+0

No estoy seguro de por qué' traditional 'no funcionaba antes, pero ahora es probable que esté en otro lado. Marcar esto como la respuesta desde que respondió hace un tiempo y está funcionando ahora. – KallDrexx

2

bien aquí algo de lo que acabo de escribir ahora que funciona!

aquí está la acción:

Public Overridable Function PostProject(ByVal model As Project) As ActionResult 
    Return Json(model.PublishedSectionIds) 

End Function 

aquí es la clase:

Public Class Project 
    Public Property ProjectId As Integer 
    Public Property PublishedSectionIds As IList(Of Integer) 
End Class 

aquí está el javascript:

 var data = {}; 
     data.ProjectId = 1; 

     data.PublishedSectionIds = $('#section_list').sortable('toArray'); 
     var url= "/testing/tester"; 
     $.ajax({ 
      url:url, 
      type: 'POST', 
      traditional: true, 
      data: data, 
      success: function (result) { 
       alert(result); 
      } 
     }); 

ignoran el hecho de que mi acción es reemplazable. eso es solo de t4mvc.

intenté con la lista siendo e IList o una lista, ambos funcionan bien.

Espero que ayude!

Editar:

También probó w/o el modelo de esta manera:

Public Overridable Function PostProject2(ByVal ProjectId As Integer, ByVal PublishedSectionIds As List(Of Integer)) As ActionResult 
     Return Json(PublishedSectionIds) 

    End Function 

añadir funcionó muy bien también.

0

Si desea manejar por completo en JS (puede que tenga que modificar la línea 2 - He supuesto que está utilizando una lista y está tratando de tirar del atributo id en sí)

var data = "projectId=" + projectId; 
$("#section_list li").each(function(){ data += "&publishedSectionIds=" + this.id;}); 
$.ajax({ url: '/main/test', 
    type: 'POST', 
    data: data, 
    success: function (result) { 
     alert(result.message); 
    } 
}); 

o si usted quiere asegurarse de que está utilizando los datos ordenable ('toArray') (aunque el resultado anterior también proporciona los datos clasificados)

var data = "projectId=" + projectId; 
var tempData = $('#section_list').sortable('toArray'); 
$.each(tempData, function(index, value){ data += "&publishedSectionIds=" + value;}); 
$.ajax({ url: '/main/test', 
    type: 'POST', 
    data: data, 
    success: function (result) { 
     alert(result.message); 
    } 
}); 
+0

el ordenable ('toArray') devuelve una matriz de los id en orden. lo que él está haciendo allí es bastante correcto. – Patricia

+0

Sí, incluso este método devuelve los id en orden, pero elimina el [] de los datos publicados. He editado el código para usar los datos ordenables ('toArray') si lo prefiere. – eapen

0

Cuando paso en matrices de JavaScript en mi método post, les escribo como un int[] no List<int>.

Pruebe esto si no lo ha hecho.

+0

No estoy seguro de para quién era este mensaje, pero con mi ejemplo de código, ASP.net server-side debería verlo como: projectId = 2 & publishedSectionIds = 1 & publishedSectionIds = 2 que debería ser legible por la lista eapen

Cuestiones relacionadas