none
CRUD con MVC 5 json y ajax RRS feed

  • Pregunta

  • Buenas Tardes.

    Tengo un problema que no puedo resolverlo. espero su ayuda soy nuevo en este lenguaje.

    Este es mi controlador.

    using System.Net;
    using System.Web;
    using System.Web.Mvc;
    using RecordGeneral.Models;
    namespace RecordGeneral.Controllers
    {
        public class TABRegpController : Controller
        {
            private RecordGeneralContext db = new RecordGeneralContext();
            public ActionResult Index()
            {            
                return View();            
            }
            public ActionResult GetIndex()
            {
                var tblTABRegp = db.TABTRegps.ToList();
                return Json(tblTABRegp, JsonRequestBehavior.AllowGet);
            }


    Este es mi vista.

    @model IEnumerable<RecordGeneral.Models.TABTRegp>
    @{
        ViewBag.Title = "Index";
    }
    <h2><span class="nuevo_lb">REGIMEN</span></h2>
    <p>
        <button type="button" id="btnCreate" class="btn btn-info btn-sm" data-toggle="modal" data-target="#TABRegpModal">
            Adicionar
        </button>
    </p>
    <table id="listTABRegp" class="table ">
            <thead>
                <tr>
                    <th>CODIGO</th>
                    <th>DESCRIPCION</th>
                </tr>
            </thead>
        <tbody></tbody>
    </table>


    y este la función Ajax.

    $(document).ready(function () {
        loadData();
    });
    var isUpdateable = false;
    
    function loadData() {
        $.ajax({
            url: '/TABRegp/GetIndex/',
            type: 'GET',
            dataType: 'json',
            success: function (data) {
                var rows = '';
                $.each(data, function (i, item) {
                    rows += "<tr>"
                    rows += "<td>" + item.RGPCodi + "</td>"
                    rows += "<td>" + item.RGPDesc + "</td>";
                    rows += "</tr>";
                    $("#listTABRegp tbody").html(rows);
                });
            },
            error: function (err) {
                alert("Error: " + err.responseText);
            }
         });
    }


    al ejecutar el aplicativo,me sale la pantalla que adjunto.

    No se cual es el error que estoy cometiendo ya tengo varios días con esto. espero que me ayuden.

    Gracias.


    domingo, 7 de mayo de 2017 23:32

Respuestas

  • hola

    No deberias devolver la entidad de EF como respuesta json ya que este se relaciona con otras trablas y genera este problema de referencia circular

    deberias crear una clase model que devuelvas

    la idea es crear una clase en la carpeta Model

    public class TABTRegpModel { public string RGPCodi {get;set;} public string RGPDesc {get;set;} }

    y luego realices el mapping entre los datos de EF devuelve y la clase que retorna como json

    
    public ActionResult GetIndex()
    {
    	var tblTABRegp = db.TABTRegps.ToList();
    	
    	Mapper.CreateMap<TABTRegp, TABTRegpModel>();
    	
    	var model = Mapper.Map<TABTRegpModel>(tblTABRegp);
    	
    	return Json(model, JsonRequestBehavior.AllowGet);
    }

    sino quieres usar automapper podrias usar linq

    public ActionResult GetIndex()
    {
    	var tblTABRegp = db.TABTRegps.ToList();
    	
    	var result = tblTABRegp.Select(x=> new {
    		RGPCodi = x.RGPCodi,
    		RGPDesc = x.RGPDesc
    	});
    	
    	return Json(result, JsonRequestBehavior.AllowGet);
    }

    pero remarco NUNCA devuelvas el objeto de EF directo como json

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta jgbaz viernes, 19 de mayo de 2017 23:34
    lunes, 8 de mayo de 2017 14:43

Todas las respuestas

  • Tiene toda la pinta de ser un problema con el modelo de entidades que se usa internamente cuando llamas a db.TABTRegps. Revisa las clases del modelo por si existe alguna referencia circular (es decir la clase A contiene un miembro de tipo B, y la clase B contiene uno de tipo A).

    lunes, 8 de mayo de 2017 6:44
  • hola

    No deberias devolver la entidad de EF como respuesta json ya que este se relaciona con otras trablas y genera este problema de referencia circular

    deberias crear una clase model que devuelvas

    la idea es crear una clase en la carpeta Model

    public class TABTRegpModel { public string RGPCodi {get;set;} public string RGPDesc {get;set;} }

    y luego realices el mapping entre los datos de EF devuelve y la clase que retorna como json

    
    public ActionResult GetIndex()
    {
    	var tblTABRegp = db.TABTRegps.ToList();
    	
    	Mapper.CreateMap<TABTRegp, TABTRegpModel>();
    	
    	var model = Mapper.Map<TABTRegpModel>(tblTABRegp);
    	
    	return Json(model, JsonRequestBehavior.AllowGet);
    }

    sino quieres usar automapper podrias usar linq

    public ActionResult GetIndex()
    {
    	var tblTABRegp = db.TABTRegps.ToList();
    	
    	var result = tblTABRegp.Select(x=> new {
    		RGPCodi = x.RGPCodi,
    		RGPDesc = x.RGPDesc
    	});
    	
    	return Json(result, JsonRequestBehavior.AllowGet);
    }

    pero remarco NUNCA devuelvas el objeto de EF directo como json

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta jgbaz viernes, 19 de mayo de 2017 23:34
    lunes, 8 de mayo de 2017 14:43