none
API Web RRS feed

  • Pregunta

  • Estimados buen día.

    Hace un mes empecé a desarrollar aplicaciones web utilizando ASP.NET.CORE.3.1 como el Backend de mi proyecto utilizando SQL Server como DB.

    Después de crear el proyecto Datos, Entidad y Web, estructuré los Contextos, los Mapping, los Models y el Controller de una clase Categorias que contiene estos datos:

    public class Categorias
        {
            public int IdCategoria { get; set; }
            [Required]
            [StringLength(50, MinimumLength = 3, ErrorMessage = "El Nombre de la Categoría debe tener más de 3 y menos de 50 Caracteres")]
            public string Nombre { get; set; }
            [StringLength(150)]
            public string Descripcion { get; set; }
            public bool Estado { get; set; }
        }

    Estructuré el Controller con la siguiente código que detalla el CRUD:

    namespace DecafeApp.Web.Controllers
    {
        [Route("api/[controller]")]
        [ApiController]
        public class CategoriasController : ControllerBase
        {
            private readonly DbContextDecafeApp _context;

            public CategoriasController(DbContextDecafeApp context)
            {
                _context = context;
            }

            // GET: api/Categorias/Listar
            [HttpGet("[action]")]
            public async Task<IEnumerable<CategoriasViewModel>> Listar()
            {
                var categoria = await _context.categorias.ToListAsync();
                return categoria.Select(c => new CategoriasViewModel
                {
                    IdCategoria = c.IdCategoria,
                    Nombre = c.Nombre,
                    Descripcion = c.Descripcion,
                    Estado = c.Estado
                });
            }

     [HttpPost("[action]")]
            public async Task<ActionResult> Crear([FromBody] CrearViewModel model)
            {
                if (!ModelState.IsValid)
                {
                    return BadRequest(ModelState);
                }

                Categorias categoria = new Categorias
                {
                    Nombre = model.Nombre,
                    Descripcion = model.Descripcion,
                    Estado = true
                };

                _context.categorias.Add(categoria);
                try
                {
                    await _context.SaveChangesAsync();
                }
                catch (Exception)
                {

                    return BadRequest();
                }

                return Ok();
            }

     [HttpPut("[action]")]
            public async Task <IActionResult> Actualizar([FromBody] ActualizarViewModel model)
            {
                if (!ModelState.IsValid)
                {
                    return BadRequest(ModelState);
                }
                if (model.IdCategoria <=0)
                {
                    return BadRequest();
                }

                var categoria = await _context.categorias.FirstOrDefaultAsync(c => c.IdCategoria == model.IdCategoria);

                if (categoria == null)
                {
                    return NotFound();
                }
                categoria.Nombre = model.Nombre;
                categoria.Descripcion = model.Descripcion;

                try
                {
                    await _context.SaveChangesAsync();
                }
                catch (DbUpdateConcurrencyException)
                {
                    // Guardar Excepción
                    return BadRequest();
                }

                return Ok();
            }

    Para probar si mi backend funcionara correctamente utilicé FIDDLER el cual me muestra que el CRUD LISTAR, CREAR funcionan correctamente pero a la hora de ejecutar ACTUALIZAR me señala un error de tipo 400:

    He buscado muchas alternativas de solución pero no he podido resolver este tema, el cual me impide seguir avanzando con el desarrollo de mi proyecto.

    Agradeceré sus sugerencias que me ayuden a resolver este inconveniente.

    Saludos cordiales;

    Eric Marín

    viernes, 8 de mayo de 2020 16:46

Respuestas

  • Hola Sergio.

    Tu sugerencia me ayudo mucho para solucionar el inconveniente que se me presentaba.

    Pero esta solución se dio en mi Fronted ya que estaba invocando en los metodos el idcategoria en vez de idCategoria tal como me lo sugeriste.

    Solo al cambiar una letra de minúscula a mayúscula se solucionó. 

    Gracias por tu apoyo

    Saludos cordiales;

    • Marcado como respuesta Huacnin miércoles, 13 de mayo de 2020 19:16
    miércoles, 13 de mayo de 2020 19:16
  • Hola, ya he visto el problema según el mensaje de tu última respuesta. Recuerda que c# es sensible a mayúsculas.

    En el json que envías mandas idcategoria que no puede deserializarse a IdCategoria. Debes enviar idCategoria 


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Propuesto como respuesta Sergio ParraModerator martes, 12 de mayo de 2020 13:18
    • Marcado como respuesta Huacnin miércoles, 13 de mayo de 2020 19:06
    martes, 12 de mayo de 2020 13:17
    Moderador
  • Entonces el problema está en la clase que usas para enviar el mensaje y realizar la llamada. Cómo es tu modelo ? Deberias cambiar a int esa propiedad IdCategoria.

    Puedes poner el código en el que realzias la llamada a ese api? El problema lo tienes en tu aplicacion Vue que trata esa propiedad como una cadena string. Revisa tu Frontend


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    miércoles, 13 de mayo de 2020 17:45
    Moderador

Todas las respuestas

  • Hola 


    Gracias por levantar tu consulta en los foros de MSDN. Con respecto a la misma, vamos a darte seguimiento e investigaremos para buscar la mejor respuesta para ti.

     
    Tu error dice que es un problema de casteo en {"$.idCategoria" : ["The JSON value could not be converted to System.Int32"]}
    Puedes mostrarme que tienes en los valores del JSON o el tipo de dato con el que se esta manejando?

    Gracias por usar los foros de MSDN.

     

    Luis Diego Mora

     ____

     

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

     

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

     

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

    • Marcado como respuesta Huacnin lunes, 11 de mayo de 2020 19:14
    • Desmarcado como respuesta Sergio ParraModerator martes, 12 de mayo de 2020 13:17
    viernes, 8 de mayo de 2020 17:33
    Moderador
  • El status 400 es un "Bad Request". Dado que en método Actualizar tienes tres return BadRequest, un primer paso que deberías realizar es especificar cuál de los tres es el que está fallando, para que podamos centrarnos en investigar por qué se produce ese fallo. Esto por supuesto es muy sencillo de determinar en tiempo de desarrollo con solo ejecutar el programa paso a paso con el debugger. Pero aparte de eso, por si acaso el error ocurre en producción es conveniente que devuelvas un texto diferenciador dentro de cada uno de los mensajes de error, por ejemplo, return BadRequest("IdCategoria es negativo").
    viernes, 8 de mayo de 2020 21:24
  • hola

    Por el mensaje que se observa no es un error 400 de http, sino que estas obteniendo una respuesta con ese json que recibes, es mas hay un mensaje indicando

          The JSON value could not be converted to System.Int32

    No se con que datos estas invocando la funcionalidad, pero revisa las propiedades que reciben numeros a ver si alguna estas asignandola de forma incorrecta

    aunque al tener solo una en el modelo deberia ser el IdCategoria el que cause el problema

    Es ams veo que tambien lo validas cuando usas

                if (!ModelState.IsValid)
                {
                    return BadRequest(ModelState);
                }

    si pones un breakpoint en el codigo, puede ver que ingresa y pasa esa validacion?

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    sábado, 9 de mayo de 2020 5:41
  • hola

    Por el mensaje que se observa no es un error 400 de http, sino que estas obteniendo una respuesta con ese json que recibes, es mas hay un mensaje indicando

          The JSON value could not be converted to System.Int32

    No se con que datos estas invocando la funcionalidad, pero revisa las propiedades que reciben numeros a ver si alguna estas asignandola de forma incorrecta

    aunque al tener solo una en el modelo deberia ser el IdCategoria el que cause el problema

    Es ams veo que tambien lo validas cuando usas

                if (!ModelState.IsValid)
                {
                    return BadRequest(ModelState);
                }

    si pones un breakpoint en el codigo, puede ver que ingresa y pasa esa validacion?

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    Leandro, efectivamente es id Categoría ya que lo indica el mensaje de error. 

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    sábado, 9 de mayo de 2020 22:38
    Moderador
  • Hola Huacnin


    ¿Alguna actualización sobre la consulta realizada? ¿Alguna de las respuestas proporcionadas te ayudó?

     

    Espero tu respuesta.

     

    Gracias por usar los foros de MSDN.

     

     

    Luis Diego Mora

    __________

    lunes, 11 de mayo de 2020 13:55
    Moderador
  • Hola Luis, gracias por tu respuesta.

    Estos son los datos que tengo en JSON el cual envio para su actualización y me genera un error

    {"idcategoria":"4",

    "nombre":"Menús & Buffets",

    "descripcion":"Platos de Comidas"

    }

    public class Categorias
        {
            public int IdCategoria { get; set; }
            [Required]
            [StringLength(50, MinimumLength = 3, ErrorMessage = "El Nombre de la Categoría debe tener más de 3 y menos de 50 Caracteres")]
            public string Nombre { get; set; }
            [StringLength(150)]
            public string Descripcion { get; set; }
            public bool Estado { get; set; }
        }
    Esta es

    la estructura de mi objeto.

    Saludos


    lunes, 11 de mayo de 2020 19:14
  • Hola, ya he visto el problema según el mensaje de tu última respuesta. Recuerda que c# es sensible a mayúsculas.

    En el json que envías mandas idcategoria que no puede deserializarse a IdCategoria. Debes enviar idCategoria 


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Propuesto como respuesta Sergio ParraModerator martes, 12 de mayo de 2020 13:18
    • Marcado como respuesta Huacnin miércoles, 13 de mayo de 2020 19:06
    martes, 12 de mayo de 2020 13:17
    Moderador
  • hola

    Si usas tools como ser

    jsin to class

    veras que las propiedades no mapean

    Deberias poner las propiedades en minuscula o usar el [JsonProperty]

        using System;
        using System.Collections.Generic;
    
        using System.Globalization;
        using Newtonsoft.Json;
    
        public partial class Categorias
        {
            [JsonProperty("idcategoria")]
            public long Idcategoria { get; set; }
    
            [JsonProperty("nombre")]
            public string Nombre { get; set; }
    
            [JsonProperty("descripcion")]
            public string Descripcion { get; set; }
        }

    pero hay un detalle, el valor del IdCategoria deberias ponerlo sin comillas para que sea numerico

    {
       "idcategoria":4,
       "nombre":"Menús & Buffets",
       "descripcion":"Platos de Comidas"
    }

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 13 de mayo de 2020 5:25
  • Estimado Luis

    Hice todas las actualizaciones a mi consulta y me sigue saliendo el mismo error.

    Al testear nuevamente mi aplicación con Fiddler ejecute estos parametros de JSON:

    {"idCategoria":"1","nombre":"Comidas","descripcion":"Platos de Comidas"}Me sigue arrojando el error 400. Pero si ejecuto este JSON:

    {"idCategoria":1,"nombre":"Comidas","descripcion":"Platos de Comidas"}, El valor de IdCategoria sin las comillas dobles

    La actualización se ejecuta, pero al ejecutar desde mi FRONTED, Vuejs, me sigue arrojando el mismo error.

    Saludos cordiales;

    Eric Marín

    miércoles, 13 de mayo de 2020 16:39
  • Entonces el problema está en la clase que usas para enviar el mensaje y realizar la llamada. Cómo es tu modelo ? Deberias cambiar a int esa propiedad IdCategoria.

    Puedes poner el código en el que realzias la llamada a ese api? El problema lo tienes en tu aplicacion Vue que trata esa propiedad como una cadena string. Revisa tu Frontend


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    miércoles, 13 de mayo de 2020 17:45
    Moderador
  • Hola Sergio.

    Tu sugerencia me ayudo mucho para solucionar el inconveniente que se me presentaba.

    Pero esta solución se dio en mi Fronted ya que estaba invocando en los metodos el idcategoria en vez de idCategoria tal como me lo sugeriste.

    Solo al cambiar una letra de minúscula a mayúscula se solucionó. 

    Gracias por tu apoyo

    Saludos cordiales;

    • Marcado como respuesta Huacnin miércoles, 13 de mayo de 2020 19:16
    miércoles, 13 de mayo de 2020 19:16