none
Consulta Get con $http Angular y Web Api RRS feed

  • Pregunta

  • Buenas a todos,

    Estoy haciendo un servicio en angular que me realiza una paticion web, tal como muestra el codigo:

    app.service("OficinasService", function ($http) {
        //Obtener Listado de todas las oficinas
        this.getOficinas = function () {
            return $http.get("/api/Oficina");
        }
    });

    y luego desde un controlador angular

    app.controller("OficinasController", function ($scope, $log, OficinasService, $http) {
        $scope.enEdiccion = false;
        $scope.Oficinas = [];
        $scope.mensaje = "Mostrando Listado de Oficinas";
        mostrarRegistro();

        //Function mostrarRegistro de todas las Oficinas
        function mostrarRegistro() {
            var promiseGet = OficinasService.getOficinas(); //The MEthod Call from service

            promiseGet.then(function (pl) { $scope.Oficinas = pl.data; console.log($scope.Oficinas) },
                  function (errorPl) {
                      $scope.mensaje = 'Error al Cargar Oficina: ' + errorPl;
                      $log.error('Error al Cargar Oficina: ', errorPl);
                  });
        }
    });

    El problema es que deberia mostrarme varios registros, dos para ser exacto, pero solo me muestra uno. Imprime por consola el objeto Oficinas y esto es lo que me muestra:

     Array[2]0: Object$$hashKey: "object:5"$id: "1"Activo: trueAutor: nullAutorAccion: nullAutorFecha: nullDescripcion: "NDPSA PRINCIPAL"Direccion: nullEmpresa_Id: 1EntityKey: ObjectEs_Principal: trueFecha_Trabajo: "2015-02-21T00:00:00"Oficina_Id: 200Parent_Id: 200Telefono1: nullTelefono2: nullUnico: 6tEmpresas: ObjecttOficinas1: Array[2]tOficinas2: Object__proto__: Object1: Object$$hashKey: "object:6"$ref: "3"__proto__: Objectlength: 2__proto__: Array[0]

    si se dan cuenta el primer object, se corresponde con el primer registro y me esta trayendo valores, pero el object1 que representa el segundo registro esta llegando en blanco sin propiedades.

    No se a que se debera esta situacion.

    lunes, 23 de febrero de 2015 20:56

Todas las respuestas

  • hola

    como serializas la entidad Oficina en el webapi ?

    de casualidad esta entidad tiene una propiedad del tipo byte[] o sea alguna imagen?

    que pasa si crear tu la informacion de una instancia en el webapi y la envias como respuesta ? porque pareciera que hay un problema en la serializacion desde el webapi

    que tipo de lista serializas a json?, porque pareciera que no es un List<>

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 23 de febrero de 2015 21:31
  • Este es el codigo que me genera al crear el controlador WebApi. ¿Hay que configurar algo para procesar formato JSon?

    public class OficinaController : ApiController
        {
            private DBEntities db = new DBEntities();

            // GET api/Oficina
            public IEnumerable<tOficinas> GettOficinas()
            {
                var toficinas = db.tOficinas.Include("tEmpresas").Include("tOficinas2");
                return toficinas.AsEnumerable();
            }

            // GET api/Oficina/5
            public tOficinas GettOficinas(int id)
            {
                tOficinas toficinas = db.tOficinas.Single(t => t.Oficina_Id == id);
                if (toficinas == null)
                {
                    throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
                }

                return toficinas;
            }

            // PUT api/Oficina/5
            public HttpResponseMessage PuttOficinas(int id, tOficinas toficinas)
            {
                if (ModelState.IsValid && id == toficinas.Oficina_Id)
                {
                    db.tOficinas.Attach(toficinas);
                    db.ObjectStateManager.ChangeObjectState(toficinas, EntityState.Modified);

                    try
                    {
                        db.SaveChanges();
                    }
                    catch (DbUpdateConcurrencyException)
                    {
                        return Request.CreateResponse(HttpStatusCode.NotFound);
                    }

                    return Request.CreateResponse(HttpStatusCode.OK);
                }
                else
                {
                    return Request.CreateResponse(HttpStatusCode.BadRequest);
                }
            }

            // POST api/Oficina
            public HttpResponseMessage PosttOficinas(tOficinas toficinas)
            {
                if (ModelState.IsValid)
                {
                    db.tOficinas.AddObject(toficinas);
                    db.SaveChanges();

                    HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, toficinas);
                    response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = toficinas.Oficina_Id }));
                    return response;
                }
                else
                {
                    return Request.CreateResponse(HttpStatusCode.BadRequest);
                }
            }

            // DELETE api/Oficina/5
            public HttpResponseMessage DeletetOficinas(int id)
            {
                tOficinas toficinas = db.tOficinas.Single(t => t.Oficina_Id == id);
                if (toficinas == null)
                {
                    return Request.CreateResponse(HttpStatusCode.NotFound);
                }

                db.tOficinas.DeleteObject(toficinas);

                try
                {
                    db.SaveChanges();
                }
                catch (DbUpdateConcurrencyException)
                {
                    return Request.CreateResponse(HttpStatusCode.NotFound);
                }

                return Request.CreateResponse(HttpStatusCode.OK, toficinas);
            }

            protected override void Dispose(bool disposing)
            {
                db.Dispose();
                base.Dispose(disposing);
            }
        }

    martes, 24 de febrero de 2015 14:33
  • Ejecute el api directamente en el navegado y esto es lo que me devuelve: 

    [{"$id":"1","unico":6,"oficina_Id":200,"empresa_Id":1,"descripcion":"OFICINA PRINCIPAL","direccion":null,"telefono1":null,"telefono2":null,"fecha_Trabajo":"2015-02-21T00:00:00","es_Principal":true,"parent_Id":200,"activo":true,"autor":null,"autorAccion":null,"autorFecha":null,"tEmpresas":{"$id":"2","unico":1,"empresa_Id":1,"rnc":"054-0132296-0","nombre":"EMPRESA XXX","eMail":null,"slogan":null,"autor":"ELVIN.LANDETA","autorAccion":"I","autorFecha":"2015-02-21T00:00:00","tOficinas":[{"$ref":"1"},{"$id":"3","unico":50,"oficina_Id":201,"empresa_Id":1,"descripcion":"SUCURSAL 1","direccion":null,"telefono1":null,"telefono2":null,"fecha_Trabajo":"2015-02-21T00:00:00","es_Principal":true,"parent_Id":200,"activo":true,"autor":null,"autorAccion":null,"autorFecha":null,"tEmpresas":{"$ref":"2"},"tOficinas1":[],"tOficinas2":{"$ref":"1"},"entityKey":{"$id":"4","entitySetName":"tOficinas","entityContainerName":"CFNContaWebEntities","entityKeyValues":[{"key":"Oficina_Id","type":"System.Int32","value":"201"}]}},{"$id":"5","unico":51,"oficina_Id":202,"empresa_Id":1,"descripcion":"SUCURSAL 2","direccion":null,"telefono1":null,"telefono2":null,"fecha_Trabajo":"2015-02-21T00:00:00","es_Principal":true,"parent_Id":200,"activo":true,"autor":null,"autorAccion":null,"autorFecha":null,"tEmpresas":{"$ref":"2"},"tOficinas1":[],"tOficinas2":{"$ref":"1"},"entityKey":{"$id":"6","entitySetName":"tOficinas","entityContainerName":"CFNContaWebEntities","entityKeyValues":[{"key":"Oficina_Id","type":"System.Int32","value":"202"}]}},{"$id":"7","unico":52,"oficina_Id":203,"empresa_Id":1,"descripcion":"SUCURSAL 3","direccion":null,"telefono1":null,"telefono2":null,"fecha_Trabajo":"2015-02-21T00:00:00","es_Principal":true,"parent_Id":200,"activo":true,"autor":null,"autorAccion":null,"autorFecha":null,"tEmpresas":{"$ref":"2"},"tOficinas1":[],"tOficinas2":{"$ref":"1"},"entityKey":{"$id":"8","entitySetName":"tOficinas","entityContainerName":"CFNContaWebEntities","entityKeyValues":[{"key":"Oficina_Id","type":"System.Int32","value":"203"}]}}],"entityKey":{"$id":"9","entitySetName":"tEmpresas","entityContainerName":"CFNContaWebEntities","entityKeyValues":[{"key":"Empresa_Id","type":"System.Int32","value":"1"}]}},"tOficinas1":[{"$ref":"1"},{"$ref":"3"},{"$ref":"5"},{"$ref":"7"}],"tOficinas2":{"$ref":"1"},"entityKey":{"$id":"10","entitySetName":"tOficinas","entityContainerName":"CFNContaWebEntities","entityKeyValues":[{"key":"Oficina_Id","type":"System.Int32","value":"200"}]}},{"$ref":"3"},{"$ref":"5"},{"$ref":"7"}]

    martes, 24 de febrero de 2015 19:19
  • que pasa si haces

    public IEnumerable<tOficinas> GettOficinas()
    {
                var toficinas = db.tOficinas.Include("tEmpresas").ToList();
                return toficinas;
    }

    para simplificar que solo devuelva las empresas y que se auna lista deconectada de EF

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    martes, 24 de febrero de 2015 20:45
  • Eso ya lo probe y sigue igual, no se si sera por que estoy usando el mvc 4; todos los ejemplos que he visto lo han hecho con mvc 5
    martes, 24 de febrero de 2015 21:00
  • la version de mvc no deberia influir, si quizas la version de EF que uses

    la entidad que serializas a json imagino propiedades como ser $id o $ref no tiene definida, o si ?


    que sucede si la clase que devuelves la desconectas de EF? o sea haces

    public object GettOficinas() { return from item in db.tOficinas

    select new {

    prop1 = item.prop1,

    //resto propiedades

    }; }

    la idea es ver si es culpa de EF que serializa de form incorrecta a json

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 24 de febrero de 2015 21:22
  • Si, Gracias ahi con eso me funciona, pero entonces, estoy perdiendo la esencia de lo que es el EF, que con solo yo ejecutar por ejemplo TOficinas.Include(TEmpresa) ta tendria en mi clase oficina la asociacion con la clase empresa..

    Ya con esto, puedo empezar a desarrolar un proyecto en mi trabajo que debio haber empezado a desarrolarse hace unos dias atras.

    Gracias!!!!

    miércoles, 25 de febrero de 2015 2:01
  • Buenas,

    Tal parece ser que el problema es la asociacion que genera el modelo entre la Tabla Oficina y Empresa, Quite esta asociacion(Clave Foranea) y el metodo funciono muy bien, pero por ejemplo al ejecutar:

     // GET api/Oficina
            public IEnumerable<tOficinas> GettOficinas()
            {
                var toficinas = db.tOficinas.Include("tEmpresas").Include("tOficinas2");
                return toficinas.AsEnumerable();
            }

    Seria por ejemplo

    [

    oficina_Id: 1,

    nombre: Principal,

    Empresa:{

    Empresa_Id: 1

    nombre: mi empresa     }

    ]

    un resultado asi es el que espero obtener, pero al parecer algo anda mal con la asociacion al momento de generar el resultado en formato JSON.

    Agradeceria mucho cualquier ayuda que puedan aportarme, ya que si elimino esta asociacion estaria perdiendo muchas pero muchas de las ventajas que ofrece en Entity FrameWork.

    jueves, 26 de febrero de 2015 22:03
  • hola

    no probaste quitar la creacion de proxy y lazyload

    Turn off lazy loading for all entities

    alli mismo define la propiedad ProxyCreationEnabled tambien en false

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 26 de febrero de 2015 23:11
  • Ya casi resuelvo, solo me queda un inconveniente mas, por ejemplo tengo esto

    0: Object

      $id: 1

       descripcion: Oficina X

       Empresa_Id: 1

       tEmpresas: Object

            $Id: 1

            Nombre: Mi Empresa

    1: Object

      $Id: 2

      descripcion: Oficina Z

      Empresa_Id: 2

      tEmpresas: Object

         $Id: 2

          nombre: Mi Empresa 2

    2: Object

       $Id: 3

         descripcion: Oficina Y

         Empresa_Id: 1

         tEmpresas: Object

           $ref: 2

    Si te fija como al una empresa que se repite dentro de un enlace ya en el siguiente registro lo que guarda es una referencia al objeto; ¿Esto es algo propio del Formato JSON o es una Configuracion del MVC? si es asi como se podria solventar este caso. ya que deseo mostrar al lado el nombre de la empresa pero cuando llega a este punto donde lo que encuentra es una referencia, no se como tratarlo.... 

    lunes, 2 de marzo de 2015 21:51