Retornar List por Json a JS desde c# con clase que contiene otra clase

publicado por: Anonymous

Tengo una clase Localidad que contiene un atributo de la clase Provincia, al querer hacer los combos anidados por Ajax con Jquery me da un:

error 500 – Internal server error-.

Si yo saco el atributo Provincia, anda perfecto. ¿Cómo puedo solucionar esto?

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;

    namespace javaScript.Models
    {
        public class Localidad
        {
            public int Id { get; set; }
            public string Descripcion { get; set; }

            [Display(Name ="Provincia")]
            public int IdProvincia { get; set; }

            public Provincia Provincia
            {
                get { return new Provincia(this.IdProvincia); }
                set { }
            }

            public void set_Provincia(int idProvincia)
            {
                this.Provincia = new Provincia(1);
            }
        }
    }

namespace javaScript.Models
{
    public class Provincia
    {
        // public int Id { get; set; }
        public int Id { get; set; }
        public string Descripcion { get; set; }
        public string Gobernador { get; set; }
        public List<Localidad> Localidades { get; set; }
    }
}

Método en el Controller para retornar la lista:

public ActionResult GetSecondValues(string IdProvincia)
{
    IEnumerable<Localidad> localidadList = null;
    var db = new Contexto();

   var id = Int32.Parse(IdProvincia);
    if (id > 0)
    {
        //se carga la lista de Localidades       
        localidadList = db.Localidades.Where(x => x.IdProvincia == id).ToList();
    }
    var retorno = Json(localidadList);
    return retorno;
}

Método Ajax en la vista:

 <script type = "text/javascript">
    $(function () {
        $("#IdProvincia").change(function () {
            var selectedItem = $(this).val();
            var ddlStates = $("#IdLocalidad");
            var statesProgress = $("#states-loading-progress");
            statesProgress.show();
            $.ajax({
                cache: false,
                type: "POST",
                url: "@(Url.Action(" GetSecondValues "))",
                data: {
                    "IdProvincia": selectedItem
                },
                success: function (data) {
                    ddlStates.html('');
                    $.each(data, function (id, option) {
                        ddlStates.append($('<option></option>').val(option.Id).html(option.Descripcion));
                    });
                    statesProgress.hide();
                },
                error: function (xhr, ajaxOptions, thrownError) {
                    alert('Failed to retrieve states.');
                    statesProgress.hide();
                }
            });
        });
    });
</script>

solución

El problema surge por una Recursividad entre la clase Provincias que contiene un List de Localidades y la clase Localidades que Contiene un atributo del tipo Provincia
Lo raro que el error salta en el método ajax y no en Visual Studio, lo que me dificulto encontrar el error, porque ajax solo me decía Error 500 Internal server error y no tengo mucha experiencia en JS.
Quitando cualquiera de los dos atributos (la lista de localidades en provincia, o la provincia en localidades) El código funciona correctamente.

 public class Localidad
        {
            public int Id { get; set; }
            public string Descripcion { get; set; }

            [Display(Name ="Provincia")]
            public int IdProvincia { get; set; }

            **public Provincia Provincia
            {
                get { return new Provincia(this.IdProvincia); }
                set { }
            }**

            public void set_Provincia(int idProvincia)
            {
                this.Provincia = new Provincia(1);
            }
        }

  public class Provincia
    {
        // public int Id { get; set; }
        public int Id { get; set; }
        public string Descripcion { get; set; }
        public string Gobernador { get; set; }
        **public List<Localidad> Localidades { get; set; }**
    }
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *