Rambo3
Rambo3

Reputation: 391

Controller recieving empty data from Ajax

I'm trying to send a collection from a view to a controller, using ajax. First I complete the data in a javascript array, and then I try to pass it to the server:

    var funciones = $("#funcionesUsuario").data("kendoGrid").dataSource.data();
    var func = [];

    for (var i = 0; i < funciones.length; i++) {
        func.push({
            "Estado": 1,
            "FechaAlta": null,
            "UsuarioAlta": null,
            "FechaModificacion": null,
            "UsuarioModificacion": null,
            "BitConcilia": funciones[i].BitConcilia,
            "BitLectura": funciones[i].BitLectura,
            "BitSupervisa": funciones[i].BitSupervisa,
            "ConciliacionId": funciones[i].ConciliacionId,
            "UsuarioId": funciones[i].UsuarioId
        })
    }

    $.post(url, { funcionesUsuario: func })
        .done(function (data) {
        alert("good job");
    });

Then, since I'm sending data for 2 objects, my parameter is a IEnumerable of said object:

public void ActualizarFuncionesUsuario(IEnumerable<FuncionUsuario> funcionesUsuario)
    {
        //do something
    }

My problem is that the controller receives 2 objects, as I can see in the funcionesUsuario.count, but they are both empty.

I tried sending int, bool and other types of variables with success, so I suspect I'm doing something wrong regarding data binding.

Below I attached pictures of what I'm sending and what I'm receiving in the other side.

Picture of the js function Picture of the controller

This is the FuncionUsuario model: `

public class FuncionUsuario : AuditableEntity { 
    public int ConciliacionId { get; set; } 
    public int UsuarioId { get; set; } 
    public bool BitLectura { get; set; } 
    public bool BitConcilia { get; set; } 
    public bool BitSupervisa { get; set; } 
    public virtual Conciliacion Conciliacion { get; set; } 
    [Display(ResourceType = typeof(Global), Name = "Descripcion")] 
    [NotMapped] 
    public string Descripcion { get; set; } 
}

Upvotes: 0

Views: 239

Answers (2)

Nkosi
Nkosi

Reputation: 247153

first construct you array as java script objects

var funciones = $("#funcionesUsuario").data("kendoGrid").dataSource.data();
var func = [];

for (var i = 0; i < funciones.length; i++) {
    func.push({
        Estado: 1,
        FechaAlta: null,
        UsuarioAlta: null,
        FechaModificacion: null,
        UsuarioModificacion: null,
        BitConcilia: funciones[i].BitConcilia,
        BitLectura: funciones[i].BitLectura,
        BitSupervisa: funciones[i].BitSupervisa,
        ConciliacionId: funciones[i].ConciliacionId,
        UsuarioId: funciones[i].UsuarioId
    })
}

Next, properly stringify them

var payload = JSON.stringify(func);

Then post it as JSON

$.ajax({
  url: url,
  type: "POST",
  contentType: "application/json",
  dataType: 'json'
  data: payload,
});

Upvotes: 1

mariocatch
mariocatch

Reputation: 8703

Try these:

Specify json as the dataType

$.post(url, { funcionesUsuario: func })
  .done(function (data) {
    alert("good job");
}, 'json');

Use $.ajax instead: docs

$.ajax({
  url: url,
  data: JSON.stringify(func),
  contentType: "application/json",
  type: "POST"
});

Upvotes: 1

Related Questions