Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

The returned list from ajax is empty but the size of the array is correct

I’m trying to pass a List from the controller to an ajax function, which I need to show a modal carousel images.

The function start when I click on a image, send a value to the ajax function, the ajax function calls a C# method in the controller, and in return I expect to have a List of paths of the images I’m showing.

This is the Html where the function starts:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

<div class="columnaPedido mb-3">
      <img class="imgPedido" src="@pd.getImagenes()" onclick="GetImagenes(@pd.getNumeroEntrega())" data-img-mostrar="@cont" />
</div>

This is the ajax function:

function GetImagenes(entrega){
    var i = 0;
    console.log(entrega);
    $.ajax({
        method: "GET",
        url: "GetPedidoImagenes",
        contentType: "aplication/json; Charset=utf-8",
        data: { 'entrega': entrega },        
        async: true,
        success: function (result) {
            console.log("Longitud: " + result.length);            
            if (result == 0) {
                alert("No hay Imagenes");
            }
            else {
                while (i < result.length) {
                    console.log(result.count);
                    var carusel = document.getElementById("Entrega_" + entrega);
                    if (i == 0) {
                        var div = document.createElement('div');
                        div.setAttribute('class', 'carousel-item active');
                        var img = document.createElement("img");
                        img.setAttribute('class', 'd-block w-100');
                        div.appendChild(img);
                        img.setAttribute('src', "/imgAndroid/" + result[i].Path);
                        carusel.appendChild(div);
                        i++;
                    }
                    else {
                        var div = document.createElement('div');
                        div.setAttribute('class', 'carousel-item');
                        var img = document.createElement('img');
                        img.setAttribute('class', 'd-block w-100');
                        div.appendChild(img);
                        img.setAttribute('src', "/imgAndroid/" +  result[i].Path);
                        carusel.appendChild(div);
                        i++;
                    }
                }
     
            }
        }
    })
};

And this is the C# Controller method:

 [HttpGet]
 public List<PedidoViewModel> GetPedidoImagenes(string entrega)
 {
            string consulta;
            List<PedidoViewModel> listaPedidos = new List<PedidoViewModel>();
            MySqlConnection connection = null;
            try
            {
                consulta = "SELECT Path from Entrega WHERE Entrega = '" + entrega + "'";
                using (connection = new MySqlConnection("datasource=" + server + ";database=" + database + ";" + ";username=" + user + ";password=" + password + ";"))
                {
                    MySqlCommand cmd = new MySqlCommand(consulta, connection);
                    connection.Open();

                    var reader = cmd.ExecuteReader();

                    while (reader.Read())
                    {
                        PedidoViewModel pedido = new PedidoViewModel();
                        pedido.setPathImagen(reader["Path"].ToString());
                        listaPedidos.Add(pedido);
                    }
                }
                return listaPedidos;

            }catch(Exception ex)
            {
                throw new Exception(ex.Message);
            }
}

This is PedidoViewModel:

[Keyless]
    public class PedidoViewModel{
      private string pathIamgenes;

      public PedidoViewModel(){
        pathIamgenes = "";
      }

     public string getImagenes() { return pathIamgenes; }
     public void setPathImagen(string x) { pathIamgenes = x; }
    }

As you can see, I pass a value from the view to the ajax function, and then from the ajax to the controller, and in return I have a list with tha paths, but the array (which is called
result) is empty, but has the right size.

What do I mean with the "right size"? If there are 2 images, result has 2 places, or 2 size.
How I checked this? with a console.log(result):

(2) [{…}, {…}]
0:{}
1:{}

But as you can see, the array is empty, and I’m expecting to have the paths of the images.

Where I am wrong? I been working for days with this and I can’t find a solution.

I’m new with Javascript and ajax, I don’t have lot of knowledge, but I think that what I’m doing is not wrong at all.

Edit

I created a public string path{get; set;} in PedidoViewModel and now console.log(result) comes like this:

(2) [{…}, {…}]
0:{path: null}
1:{path: null}

new PedidoViewModel:

[Keyless]
 public class PedidoViewModel{
     public string path{get; set;} = "";
  }

>Solution :

This class doesn’t have any serializable properties:

public class PedidoViewModel{
  private string pathIamgenes;

  public PedidoViewModel(){
    pathIamgenes = "";
  }

  public string getImagenes() { return pathIamgenes; }
  public void setPathImagen(string x) { pathIamgenes = x; }
}

It has a field and has methods for interacting with that field. But in general serializers are looking for properties. (As are ORMs, etc. Properties are the standard in C#.)

Refactor your class to use properties, which significantly simplies it anyway:

public class PedidoViewModel{
  public string PathIamgenes { get; set; } = "";
}

Then that one property would be serialized in the JSON:

{
  "PathIamgenes": ""
}

Naturally, the rest of the code which uses this class would need to be adjusted to make use of its new structure.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading