Envío de datos JSON al controller MVC. ¿Por qué no maneja types complejos?

Defina las classs de ayuda C # como:

`
public class SelectedFiles {public string Host {get; set; }

public List<SelectedFile> Files { get; set; } } public class SelectedFile { public string ShortName {get; set;} public string Category { get; set; } }` 

Y defina dos methods de controller (+ Deserialize helper):

  private SelectedFiles Deserialize(string json) { using (MemoryStream stream = new MemoryStream(System.Text.ASCIIEncoding.ASCII.GetBytes(json))) { DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(SelectedFiles)); return (SelectedFiles) serializer.ReadObject(stream); } } /// <summary> /// MVC seems to be incapable to deserizalize complex types. /// </summary> /// <param name="selectedFilesJSON"></param> /// <returns></returns> public void UploadFiles(SelectedFiles selectedFilesJSON) { var result = selectedFilesJSON; } /// <summary> /// </summary> /// <param name="selectedFilesJSON"></param> /// <returns></returns> public void UploadFilesJSON(string selectedFilesJSON) { if (!string.IsNullOrEmpty(selectedFilesJSON)) { var result = this.Deserialize(selectedFilesJSON); } } 

Con javascript llamando

  var SelectedFiles = []; var SelectedFile; selectedCheckBoxes.each(function(idx, element){ SelectedFile = {ShortName: element.value, Category: "a category"}; SelectedFiles.push(SelectedFile); }); var selectedFileMessage = {}; selectedFileMessage.Host = "test" selectedFileMessage.Files = SelectedFiles; var message = $.toJSON(selectedFileMessage); $.ajax({url:"UploadFilesJSON", type:'POST', traditional:true, data: { selectedFilesJSON : message } , success: function(result){ alert(result);} }); $.ajax({url:"UploadFiles", type:'POST', traditional:true, data: { selectedFilesJSON : selectedFileMessage } , success: function(result){ alert(result);} }); 

El primer método .ajax POST funcionará. Básicamente, volcar el object JSON serializado como una cadena al método del controller.

El segundo .ajax POST no funciona. No parece descubrir cómo deserializar la class de ayuda 'SelectedFiles' de la list de arguments.

Una palabra: 'Flabergasted'

Ha labeldo su pregunta con ASP.NET MVC 2, si es correcto, no tiene soporte de enlace JSON listo para usar. JsonValueProviderFactory está disponible desde ASP.NET MVC 3. Para enlazar JSON en versiones anteriores de ASP.NET MVC, necesita crear un proveedor de valor o un model de carpeta. Puede leer más sobre esto aquí: Enviar JSON a un método de acción MVC de ASP.NET Argumento

En el segundo caso, los datos de publicación esperados son la colección de SelectedFile. Has probado

 $.ajax({url:"UploadFiles", type:'POST', traditional:true, data: SelectedFiles, success: function(result){ alert(result);} }); 

Debe marcar su tipo de contenido de POST como json. Además, MVC modelará su model para que no necesite usar una cadena como parámetro de acción. Phil Haack tiene un ejemplo en su blog.

    Intereting Posts