none
Modelo no es valido para el Login RRS feed

  • Pregunta

  • Hola a todos,

    Tengo mi clase que se generó con EF, que se llama Tb_Usuario.

            public int id { get; set; }
    
            [Display(Name = "Nombre(s)")]
            [Required(ErrorMessage = "Debe de ingresar su {0}.")]
            [SoloLetra(ErrorMessage = "El {0} debe contener sólo letras.")]
            public string nombre { get; set; }
    
            [Display(Name = "Apellido(s)")]
            [Required(ErrorMessage = "Debe de ingresar sus {0}s.")]
            [SoloLetra(ErrorMessage = "El {0} debe contener sólo letras.")]
            public string apellido { get; set; }
    
            [Display(Name = "DNI")]
            [Required(ErrorMessage = "Debe de ingresar su {0}.")]
            [SoloNumero(ErrorMessage = "El {0} debe contener sólo números.")]
            [StringLength(8, MinimumLength = 8, ErrorMessage = "El {0} debe contener 8 dígitos.")]
            public string dni { get; set; }
    
            [Display(Name = "Correo electrónico")]
            [Required(ErrorMessage = "Debe de ingresar su {0}.")]
            [EmailAddress(ErrorMessage = "El {0} ingresado no es válido.")]
            public string correo { get; set; }
    
            [Display(Name = "Contraseña")]
            [Required(ErrorMessage = "Debe de ingresar su contraseña.")]
            public string contrasena { get; set; }
    
            public int idRol { get; set; }
    
            [Required(ErrorMessage = "Debe de seleccionar su nacionalidad.")]
            public int idPais { get; set; }
    
            [Display(Name = "Sexo")]
            [Required(ErrorMessage = "Debe de seleccionar su sexo.")]
            public string sexo { get; set; }

    Eso lo uso cuando creo un nuevo usuario, pero cuando lo uso para hacer el login, a pesar de que ingreso lo valores, no me reconoce como válido el modelo.

    Según he buscado, tendría que hacer :

    - permitir valores nulos a los atributos.

    - crear una clase especial, donde tome solo esos dos campos

    No hay una manera de usar esa misma clase?

    Gracias.

    lunes, 8 de agosto de 2016 3:29

Respuestas

  • hola

    Es que no se usa el mismo modelo deebrias crear otro simple con solo dos propiedades

    En el login la clase model que defiens solo requiere 2 o 3 propiedades, no uses la clase completa del usuario que creo EF

    >>crear una clase especial, donde tome solo esos dos campos

    toma este camino

    >>No hay una manera de usar esa misma clase?

    no y si la hubiera tampoco debes hacerlo, no debs usar un modelo complejo cuando no lo requiere

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 8 de agosto de 2016 4:29
  • hola

    >>Entonces tengo que agregarle los mismos DataAnnotations? no hay forma de tomar del otro modelo

    recomendaria que esa clase tenga sus propios atributos de validacion, pero hay una alternativa intermedia la herencia, podrias hacer que un modelo herede del otro, si es que lo extiende

    public class LoginModel{
    
    }
    
    public class Tb_Usuario : LoginModel {
    
    }

    por supuesto en Tb_Usuario no defiens als propiedades que la otra clase que tiene

    igualmente debo decir que no me gusta tanto esta alternativa ya que se supone que una clase que usas con EF no deberias usarla en una view

    deberias crear clases separadas y mapear una a otro usando automapper

    las entidades de persistencia no deberian tener atributos de DataAnnotation

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    martes, 9 de agosto de 2016 4:10
  • Gladys CM,

    En tanto te responde Leandro,

    {?}- Entonces tengo que agregarle los mismos DataAnnotations? no hay forma de tomar del otro modelo.

    Pues yo creo que debes de agregar atributos propios a [LoginModel], sobre todo porque ambos modelos no comparten -en su totalidad- los mismos atributos o los mismos son distintos, me explico: cuando registras un usuario, quizá la etiqueta es 'Ingrese una cuenta de usuario', al autenticar un usuario basta con 'Usuario'; cuando el usuario ingresa una contraseña debes validar la "fuerza" de la misma mediante la petición de símbolos especiales, número de caracteres, dígitos,  etc., dicha validación no sucede cuando un usuario escribe la contraseña al autenticarse. De igual forma, cuando un usuario se registra se exige confirmar la clave, en el proceso de autenticación no es requerido. Como vez, los atributos son distintos dado que no es lo mismo autenticar que registrar.

    {?}- Entonces en mis otro modelos, si necesito sólo obtener algunos campos es indispensable tener que crear una clase por cada una

    Hay que ver, si tienes varios de esos casos quizá sea síntoma de que no tienes los modelos adecuados o que diseñaste el modelo de manera incorrecta. Algo que debes de tener en cuenta es que una tabla de base de datos no tiene porque convertirse en un modelo (ViewModel), tus modelos representan la persistencia de la lógica del negocio que no necesariamente guarda correspondencia con las tablas de una base de datos.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Gladys CM martes, 9 de agosto de 2016 18:27
    martes, 9 de agosto de 2016 3:15
  • Gladys CM,

    No lo veo mal, sin embargo ¿cuándo o quién cambia el rol?. Veo también que el usuario tiene un atributo [UltimaCompra] ¿es necesario?, ese dato se obtiene de las compras realizadas, será un fastidio que tengas que estar actualizando dicha tabla por cada compra, te recomiendo lo retires, la última compra es un dato que lo puedes obtener.

    Algo de convenciones: para nombrar las propiedades deberías utilizar el estilo de escritura PascalCase:

    User.IdRol
    User.FechaRegistro

    El nombre del parámetro '_nuevo' tampoco me gusta.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Gladys CM miércoles, 10 de agosto de 2016 20:15
    miércoles, 10 de agosto de 2016 19:22

Todas las respuestas

  • hola

    Es que no se usa el mismo modelo deebrias crear otro simple con solo dos propiedades

    En el login la clase model que defiens solo requiere 2 o 3 propiedades, no uses la clase completa del usuario que creo EF

    >>crear una clase especial, donde tome solo esos dos campos

    toma este camino

    >>No hay una manera de usar esa misma clase?

    no y si la hubiera tampoco debes hacerlo, no debs usar un modelo complejo cuando no lo requiere

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 8 de agosto de 2016 4:29
  • Gracias por responder Leandro,

    He creado :

        public class LoginModel
        {
            public string correo { get; set; }
            public string contrasena { get; set; }
        }

    Entonces tengo que agregarle los mismos DataAnnotations? no hay forma de tomar del otro modelo.

    Entonces en mis otro modelos, si necesito sólo obtener algunos campos es indispensable tener que crear una clase por cada una ?

    Saludos y gracias.

    martes, 9 de agosto de 2016 0:26
  • Gladys CM,

    En tanto te responde Leandro,

    {?}- Entonces tengo que agregarle los mismos DataAnnotations? no hay forma de tomar del otro modelo.

    Pues yo creo que debes de agregar atributos propios a [LoginModel], sobre todo porque ambos modelos no comparten -en su totalidad- los mismos atributos o los mismos son distintos, me explico: cuando registras un usuario, quizá la etiqueta es 'Ingrese una cuenta de usuario', al autenticar un usuario basta con 'Usuario'; cuando el usuario ingresa una contraseña debes validar la "fuerza" de la misma mediante la petición de símbolos especiales, número de caracteres, dígitos,  etc., dicha validación no sucede cuando un usuario escribe la contraseña al autenticarse. De igual forma, cuando un usuario se registra se exige confirmar la clave, en el proceso de autenticación no es requerido. Como vez, los atributos son distintos dado que no es lo mismo autenticar que registrar.

    {?}- Entonces en mis otro modelos, si necesito sólo obtener algunos campos es indispensable tener que crear una clase por cada una

    Hay que ver, si tienes varios de esos casos quizá sea síntoma de que no tienes los modelos adecuados o que diseñaste el modelo de manera incorrecta. Algo que debes de tener en cuenta es que una tabla de base de datos no tiene porque convertirse en un modelo (ViewModel), tus modelos representan la persistencia de la lógica del negocio que no necesariamente guarda correspondencia con las tablas de una base de datos.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Gladys CM martes, 9 de agosto de 2016 18:27
    martes, 9 de agosto de 2016 3:15
  • hola

    >>Entonces tengo que agregarle los mismos DataAnnotations? no hay forma de tomar del otro modelo

    recomendaria que esa clase tenga sus propios atributos de validacion, pero hay una alternativa intermedia la herencia, podrias hacer que un modelo herede del otro, si es que lo extiende

    public class LoginModel{
    
    }
    
    public class Tb_Usuario : LoginModel {
    
    }

    por supuesto en Tb_Usuario no defiens als propiedades que la otra clase que tiene

    igualmente debo decir que no me gusta tanto esta alternativa ya que se supone que una clase que usas con EF no deberias usarla en una view

    deberias crear clases separadas y mapear una a otro usando automapper

    las entidades de persistencia no deberian tener atributos de DataAnnotation

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    martes, 9 de agosto de 2016 4:10
  • Hola Leandro y Willams, gracias por sus respuestas.

    Una última pregunta para cerrar este hilo.

    Los métodos que se crean para consultar y/o procesar datos del modelo donde deben ir ?

    Las había implementado en la clase Tb_Usuario que me generó el EF.

    Pero ahora, con los consejos eliminé los DataAnnotations de esa entidad y me quedó :

    Los método de consulta deben quedar en esa entidad, o tendría que agregarlos en mi clase UsuarioViewModel ? (<-- Esta clase es la que estará enlazada a la vista)

    Para pasar entre ambas clases voy a usar AutoMapper.

    Saludos y gracias.

    miércoles, 10 de agosto de 2016 1:39
  • Hola,

    Agradecería que me digan si es correcto esta implementación.

     public void addUsuario(UsuarioViewModel _nuevo)
            {
                using (bd = new BD_THESTOREEntities())
                {
                    tb_Usuario user = Mapper.Map<UsuarioViewModel, tb_Usuario>(_nuevo);
    
                    //Propiedades por defecto
                    user.idRol = Constantes.Usuario_ROL_DEFAULT;
                    user.ultimaCompra = null;
                    user.fecReg = DateTime.Now;
                    user.estado = Constantes.Usuario_ESTADO_DEFAULT;
    
                    bd.tb_Usuario.Add(user);
                    bd.SaveChanges();
                }
            }

    Gracias y saludos.

    miércoles, 10 de agosto de 2016 17:33
  • Gladys CM,

    No lo veo mal, sin embargo ¿cuándo o quién cambia el rol?. Veo también que el usuario tiene un atributo [UltimaCompra] ¿es necesario?, ese dato se obtiene de las compras realizadas, será un fastidio que tengas que estar actualizando dicha tabla por cada compra, te recomiendo lo retires, la última compra es un dato que lo puedes obtener.

    Algo de convenciones: para nombrar las propiedades deberías utilizar el estilo de escritura PascalCase:

    User.IdRol
    User.FechaRegistro

    El nombre del parámetro '_nuevo' tampoco me gusta.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Gladys CM miércoles, 10 de agosto de 2016 20:15
    miércoles, 10 de agosto de 2016 19:22
  • Gracias  por responder Willams Morales ,

    Tienes razón, voy a quitar ese campo.

    No había escuchado el estilo de escritura PascalCase, yo uso la notación de camello o camelCase (desde que aprendí programación la uso :D , y cambiarlo ahora es un poco complicado) y bueno que decir con los parámetros siempre uso el underline antes, es como una constumbre. Pero son malas prácticas o son consideraciones que se pueden obviar ?

    Y si no fuera mucha molestia, una paso arriba del código que mostré hize una preguntita de dónde debería ir los métodos que hago a mi BD, haber si podrías ayudarme.

    Gracias nuevamente.


    miércoles, 10 de agosto de 2016 20:15