2011-12-06 19 views
5

Tengo un problema extraño con MVC3 y el enlace del modelo. Cuando publico un objeto JSON en mi controlador, la carpeta modelo no puede crear un objeto tipeado. Todas las propiedades son las predeterminadas (es decir, cadenas vacías)MVC3 El enlace de modelo Json no funciona cuando se envía al servidor

Sin embargo, si creo una instancia en el servidor y la envío como resultado de una acción JSON, los datos en el cable son idénticos.

He tratado con

$.ajaxSettings.traditional = true; 

y no hace ninguna diferencia

Como ejemplo, si he puesto

{"RoutineName":"My new routine","Routines":[{"DayName":"Monday","Items":[21,31]}]} 

falla El aglutinante modelo, sino que procede del servidor los datos parece

{"RoutineName":"Routine From Code","Routines":[{"DayName":"Monday","Items":[1,2]},{"DayName":"Tuesday","Items":[]}]} 

el código HTML utilizado para generar esto parece

$('#submitRoutine').click(function() { 
      var routines = []; 
      $('.DayName').each(function (index, item) { 
       var $item = $(item); 
       var name = $item.html(); 
       var routineItems = []; 
       $($item.attr('href')).find('.itemId').each(function() { 
        routineItems.push(parseInt($(this).val(), 10)); 
       }); 
       routines.push({ 
        DayName: name, 
        Items: routineItems 
       }); 
      }); 
      var routine = { 
       RoutineName: $('#routineName').val(), 
       Routines: routines 
      }; 

      $.ajaxSettings.traditional = true; 
      $.post('/Machine/CreateRoutine', JSON.stringify(routine),function (data) {},'json'); 
     }); 

Así que parece que la unión de un objeto introducido a JSON modelo está bien, pero volver a la inversa no es. ¿Hay algo que me he perdido?

Los modelos están en F #

type RoutineDayViewModel() = 
    let mutable _name = String.Empty 
    let mutable _items = new ResizeArray<int>() 

    member x.DayName with get() = _name and set value = _name <- value 
    member x.Items with get() = _items and set value = _items <- value 

type RoutineViewModel() = 
    let mutable _name = String.Empty 
    let mutable _routines = new ResizeArray<RoutineDayViewModel>() 

    member x.RoutineName with get() = _name and set value = _name <- value 
    member x.Routines with get() = _routines and set value = _routines <- value 

EDIT: También he probado con las siguientes clases de C# y obtener el mismo resultado

public class RoutineDayViewModel 
    { 
     public string DayName { get; set; } 
     public List<int> Items{ get; set; } 
    } 

    public class RoutineViewModel 
    { 
     public string RoutineName { get; set; } 
     public List<RoutineDayViewModel> Routines { get; set; } 
    } 

También he añadido lo siguiente a la Global.asax

ValueProviderFactories.Factories.Add(new JsonValueProviderFactory()) 

Gracias

+0

¿Cómo se ve su modelo? Estás usando getters y setters ¿no? – JesseBuesking

+0

, sí, son modelos F # pero tienen captadores y decodificadores igual que una clase C#. He agregado el código del modelo a mi pregunta. ResizeArray es un nombre F # para List Dylan

+0

Sé en C# que debe indicar explícitamente que un controlador permite solicitudes JSON GET o de lo contrario las rechazará. ¿Has hecho eso por tus controladores?* Es malo que estés publicando>< – JesseBuesking

Respuesta

8

Es necesario configurar el tipo de contenido petición a application/json si tiene intención de enviar una solicitud con formato JSON que es lo que está haciendo con el método JSON.stringify . Así que en lugar de:

$.post('/Machine/CreateRoutine', JSON.stringify(routine),function (data) {},'json'); 

puede usar:

$.ajax({ 
    url: '/Machine/CreateRoutine', 
    type: 'POST', 
    contentType: 'application/json; charset=utf-8', 
    data: JSON.stringify(routine), 
    success: function (data) { 

    } 
}); 

Con esto no es necesario para establecer $.ajaxSettings.traditional ni usted debe añadir ningún JsonValueProviderFactory en su Global.asax como ya se ha añadido este proveedor de forma predeterminada en ASP.NET MVC 3.

Cuestiones relacionadas