2012-04-04 31 views
16

He estado luchando para encontrar una solución a este problema.Matriz de publicaciones como Controlador JSON a MVC

En mi código, estoy construyendo una matriz de un objeto;

var $marks = []; 

var mark = function (x, y, counter){ 
    this.x = x; 
    this.y = y; 
    this.counter = counter; 
} 

$marks.push(new mark(1, 2, 0)); 
$marks.push(new mark(1, 2, 1)); 
$marks.push(new mark(1, 2, 2)); 

Ahora quiero publicar estos datos a un controlador MVC, por lo que podría pensar que el tipo de datos en el controlador sería un List<Mark> Marks o una matriz de las marcas.

Para publicar los datos, lo he intentado;

var json = JSON.stringify($marks); 
$.post('url', json).done(function(data){ /* handle */ }); 

O

var json = { Marks: $marks }; 
$.post('url', json).done(function(data){ /* handle */ }); 

La segunda manera, cuando se mira en los datos publicados, se parece a esto

Marks[0][x]: 1 
Marks[0][y]: 2 
Marks[0][counter]: 0 
Marks[0][x]: 1 
Marks[0][y]: 2 
Marks[0][counter]: 1 
Marks[0][x]: 1 
Marks[0][y]: 2 
Marks[0][counter]: 2 

pero no estoy seguro de cómo se traduce esto en un objeto fuertemente tipado en el controlador?

Mi controlador se ve así;

[HttpPost] 
public ActionResult JsonSaveMarks(List<Mark> Marks){ 
    // handle here 
} 

Mi clase de Mark se parece así;

public class Mark{ 
    public string x { get; set; } 
    public string y { get; set; } 
    public string counter { get; set; } 
} 

He leído a través de otros problemas similares acerca de la creación de una costumbre JsonFilterAttribute, o el uso de la clase System.Web.Script.Serialization.JavaScriptSerializer, pero no puedo hacer nada para trabajar

¿Hay algo obvio que me falta aquí? ¿Tengo el DataType en el controlador completamente equivocado? ¿Cómo puedo convertir estos datos publicados en un objeto fuertemente tipado?

Muchas Gracias

+0

¿Cómo es tu Mark-class en MVC? – Pbirkoff

+0

@Pbirkoff He actualizado la pregunta con la clase –

+1

marque esta pregunta, especialmente la primera respuesta: http://stackoverflow.com/questions/4789481/post-an-array-of-objects-via-json-to-asp -net-mvc3 – Pbirkoff

Respuesta

14

$.post() no le permite establecer el tipo de contenido de la llamada AJAX - que puede encontrar (si se utiliza violinista) que su cadena JSON se envía con un tipo de contenido de la "aplicación/x-www-form-urlencoded "(la configuración predeterminada) que luego hace que Asp.Net MVC interprete incorrectamente su paquete de datos.

¿Puede intentar usar $.ajax() y establecer el tipo de contenido en "application/json"?

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

+0

Ah, me ganaste, tuve la misma idea – Pbirkoff

+1

Gracias! ¡Después de todo ese dolor de cabeza que sabía que sería algo simple! Cambié mi código a usar '$ .ajax()' también, pasé los datos a través de 'JSON.stringify ($ marks)' –

+0

Muchas gracias. Era el tipo de contenido en mi caso. – Jelling

13

@SteveHobbs tiene la respuesta aquí. Por otro lado, debe JSON.stringify la carga de JavaScript como lo hizo. Si lo haces de la otra manera, obtendrás una excepción que dice algo como "Primitiva JSON inválida" al deserializar los datos entrantes.

Aquí está la solución completa a su muestra:

$.ajax({ 

    url: '/home/index', 
    type: 'POST', 
    data: JSON.stringify($marks), 
    dataType: 'json', 
    contentType: 'application/json', 
    success: function (data, textStatus, jqXHR) { 
     console.log(data); 
    } 
}); 
1

Este código fija mi problema:

clases de C#:

public class MediaAccountContent 
{ 
    public Guid IdMedia { get; set; } 
    public string Value { get; set; } 

} 

public class User 
{ 
    public string Firstname { get; set; } 
    public string Lastname { get; set; } 
    public List<MediaAccountContent> MediaAccountContents { get; set; } 
} 

MVC acción:

public ActionResult SavePlace(User user) 
{ 

    return Content("OK"); 
} 

Javascript:

var mediaAccountsJson = []; 

    for (var i = 0; i < 10; i++) 
    { 
     mediaAccountsJson.push({ 
      IdMedia: i, 
      Value: "AAA" + i 
     }); 

    } 

    var datatItem = 
    { 
     Firstname: "Test Firstname", 
     Lastname: "Test Lastname", 
     MediaAccountContents: mediaAccountsJson 
    }; 

    $.ajax({ 
     type: "POST", 
     contentType: 'application/json; charset=utf-8', 
     data: JSON.stringify(datatItem), 
     url: urlAction, 
     success: function (status) { 



     } 
    }); 

¡Realice los cambios necesarios para su situación y disfrute! :)

+0

este código solo publica el objeto json no una matriz de objetos – mzonerz

Cuestiones relacionadas