none
ASP.NET CORE MVC RRS feed

  • Pregunta

  • Tengo el siguiente problema, tengo una aplicacion ASP.NET CORE MVC en el cual el tipo de autenticacion es individual y estoy usando Identity en el cual estoy extendiendo(aumentando campos como CI, Nombre...) mediante una clase ApplicationUser, luego he creado una clase Carpeta el cual tiene una relacion con ApplicatioUser es decir que un usuario puede tener muchas carpetas, hasta ahí todo esta bien la aplicación funciona, registra todo bien pero al momento de modificar(Edit) algún valor de la clase carpeta se pierde el valor id es como decir que el contexto modifica ese valor a continuación adjunto el código.

    // GET: Carpetas/Edit/5

    public async Task<IActionResult> Edit(int? id) { if (id == null) { return NotFound(); } var carpeta = await _context.Carpeta.FindAsync(id); ViewData["DepartamentoId"] = new SelectList(_context.Departamento, "DepartamentoId", "Nombre"); ViewData["ProvinciaId"] = new SelectList(_context.Provincia, "ProvinciaId", "Nombre"); ViewData["MunicipioId"] = new SelectList(_context.Municipio, "MunicipioId", "Nombre"); ViewData["UbicacionId"] = new SelectList(_context.Ubicacion, "UbicacionId", "Nombre"); //ViewData["Id"] = new SelectList(_context.Users, "Id", "FullName", resolucion.Id); ViewData["UsersId"] = new SelectList(_context.Users, "Id", "FullName", carpeta.Id); if (carpeta == null) { return NotFound(); } return View(carpeta); } // POST: Carpetas/Edit/5 // To protect from overposting attacks, please enable the specific properties you want to bind to, for // more details see http://go.microsoft.com/fwlink/?LinkId=317598. [HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> Edit(int id, [Bind("CarpetaId,IDCarpeta,AgrupacionSocial,Cuerpos,Fojas,Poligono,Id,DepartamentoId,ProvinciaId,MunicipioId,UbicacionId")] Carpeta carpeta) { if (id != carpeta.CarpetaId) { return NotFound(); } if (ModelState.IsValid) { try { _context.Update(carpeta); await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!CarpetaExists(carpeta.CarpetaId)) { return NotFound(); } else { throw; } } return RedirectToAction(nameof(Index)); } return View(carpeta); }

    el problema esta en esta linea de codigo 
    ViewData["UsersId"] = new SelectList(_context.Users, "Id", "FullName", carpeta.Id);
    por que al momento de ejecutar esa linea el (id) se pierde y lo coloca como valor 0 y me direcciona a una pagina en blanco 

       


    • Editado SOLARONE(1) viernes, 7 de diciembre de 2018 20:31
    viernes, 7 de diciembre de 2018 14:27

Respuestas

  • Y si Renombra tanto el campo Id de Carpeta a digamos UserId y el ViewBag lo pones como UserId? Cambia también la vista. Lo digo por no confundir Id con id. A veces qmrste ejercicio de Renombrar las cosas ayuda a resolver este tipo de errores 


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

    • Marcado como respuesta SOLARONE(1) lunes, 10 de diciembre de 2018 2:48
    lunes, 10 de diciembre de 2018 2:28
    Moderador

Todas las respuestas


  • Hola  SOLARONE(1)

    Gracias por levantar tu consulta en los foros de MSDN. Con respecto a la misma, te comento que estaremos realizando una revisión a profundidad acerca del inconveniente que se te está presentando.

    Proporcionaremos una respuesta lo más pronto posible.

    Gracias por usar los foros de MSDN.

    Pedro Alfaro
     ____

    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.
    viernes, 7 de diciembre de 2018 17:12
    Moderador
  • hola

    Pero en el codigo que publicas no veo ninguna edicion de ninguna entidad, solo estas realizando un SELECT a la tabla de Users

    ademas no entiendo porque si listas usuarios pones como id de seleccion la carpeta, eso esta muy raro, si los ids coinciden es pura casualidad

    deberias poner un breakpoint en el codigo y evaluar que id esta llegando cuando haces

    varcarpeta =await _context.Carpeta.FindAsync(id);

    si estas mezclando los id de usuario con los de carpeta puede que no encuentres una entidad

    ----

    Por otro lado nombra de forma correcta las key del ViewBag, pones UsersId

    ViewBag["UsersId"]

    cuando en realidad es una lista y no son ids simples, no se podria ser UserList o algo asi


    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 7 de diciembre de 2018 19:41
  • Leandro Tuttini, gracias por reponder en cuanto a lo que dices si yo quito la linea de codigo y hago una modificacion a los datos me actualiza la informacion sin necesidad de aumentar ni una linea mas de codigo, en cuanto al break en la linea de codigo que indicas pues sigue manteniendo el id = 1 sin embargo en el post de Edit el id=0 es ahi donde no quiere actualizar la informacion cuando el dato es 0, segundo estoy viendo es por que hace referencia a otro contexto. 
    viernes, 7 de diciembre de 2018 20:28
  • hola

    >>cuanto al break en la linea de codigo que indicas pues sigue manteniendo el id = 1 sin embargo en el post de Edit el id=0

    para que pones el id por separado en el action que recibe el post

    Create Edit View in ASP.NET MVC

    el id se pone el el GET de edicion que mostraria la view con los datos de la entidad, en el action del POST el id viaja en el body por lo que llega con la entidad, ese parametro int id debrias quitarlo

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 7 de diciembre de 2018 20:51
  • Gracias, pues yo no puse eso, eso lo coloco scaffolding osea cree un Controlador con (Controlador de MVC con vistas que usan Entity Framework), lo raro es que si quito la linea 

    ViewData["UsersId"] = new SelectList(_context.Users, "Id", "FullName", carpeta.Id);

    en el Edit de GET todo funciona y actualiza la informacion.

    viernes, 7 de diciembre de 2018 21:02
  • Hola, puedes mostrar cómo tienes definido tu modelo Carpeta? El problema seguramente lo tienes en el [Bind()]  Yo probaría a quitar ese decorador. 

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

    viernes, 7 de diciembre de 2018 21:22
    Moderador
  • Sergio Parra, muchas gracias por responder lo que pasa que ese decorador lo necesito para recuperar los usuarios registrados en el sistema y eso es lo que hago con eso. 

    La definición de la clase carpeta es la siguiente

    public class Carpeta
        {
            [Key]
            public int CarpetaId { get; set; }
            [Required(ErrorMessage = "El campo IDCarpeta es obligatorio.")]
            [MaxLength(6)]
            [MinLength(6)]
            [RegularExpression("[TJCBCH]{1,2}[0-9]{1,4}", ErrorMessage = "El formato es incorrecto Ejm. TJ0125.")]
            public string IDCarpeta { get; set; }
            [Required(ErrorMessage = "El campo AgrupacionSocial es obligatorio.")]
            public string AgrupacionSocial { get; set; }
            [Required]
            [Range(1, short.MaxValue, ErrorMessage = "El valor {0} debe ser numérico.")]
            public int Cuerpos { get; set; }
            [Required]
            [Range(1, short.MaxValue, ErrorMessage = "El valor {0} debe ser numérico.")]
            public int Fojas { get; set; }
            [Required(ErrorMessage = "El campo Poligono es obligatorio.")]
            public int Poligono { get; set; }
            [Required]
            public DateTime FechaRegistro { get; set; }
            //public List<Predio> Predios { get; set; }
            [Required]
            [ForeignKey("Departamento")]        
            public int DepartamentoId { get; set; }
            public Departamento Departamento { get; set; }
            [ForeignKey("Provincia")]        
            public int? ProvinciaId { get; set; }
            //[Required]
            public Provincia Provincia { get; set; }
            [ForeignKey("Municipio")]        
            public int? MunicipioId { get; set; }        
            public Municipio Municipio { get; set; }
            [ForeignKey("ApplicationUser")]
            public string Id { get; set; }
            //public ApplicationUser ApplicationUser { get; set; }
            public ApplicationUser User { get; set; }
            [ForeignKey("Ubicacion")]        
            public int UbicacionId { get; set; }
            public Ubicacion Ubicacion { get; set; }
        }
    public class ApplicationUser : IdentityUser
        {
            public ApplicationUser() : base()
            {
    
            }
            public int Ci { get; set; }
            public string Nombres { get; set; }
            public string Apellidos { get; set; }
            //public string Celular { get; set; }
            public string Cargo { get; set; }
            public string Profesion { get; set; }
            public Boolean Activo { get; set; }
            public string FullName { get { return string.Format("{0} {1}", this.Nombres, this.Apellidos); } }
            public ICollection<Resolucion> Resoluciones { get; set; }
            public ICollection<Carpeta> Carpetas { get; set; }
        }





    viernes, 7 de diciembre de 2018 21:25
  • Veo que tienes mal este decorador.

    [ForeignKey("ApplicationUser")]
            public string Id { get; set; }

    Deberías cambiarlo a 

    [ForeignKey("User")]
            public string Id { get; set; }

    Que es una propiedad que tienes definido. 

    O descomentar 

            //public ApplicationUser ApplicationUser { get; set; }

    Y eliminar la propiedad 

    public ApplicationUser User { get; set; }


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


    viernes, 7 de diciembre de 2018 22:28
    Moderador
  • Anteriormente estaba asi como dices pero a un asi  persiste el error 
    viernes, 7 de diciembre de 2018 23:52
  • Por que cuando edito el nombre de Funcionario no me selecciona su valor, eso mismo no pasa con Departamento , provincia y municipio los cuales aparecen con sus respectivos valores.

    el código que recupera todo eso es el siguiente 

    // GET: Carpetass/Edit/5

    public async Task<IActionResult> Edit(int? id) { if (id == null) { return NotFound(); } var carpeta = await _context.Carpetas.FindAsync(id); ViewData["DepartamentoId"] = new SelectList(_context.Departamentos, "DepartamentoId", "Nombre"); var fullNames = await _context.Users.ToListAsync();// Select(u => new { UserID = u.Id, FullName = u.Nombres + " " + u.Apellidos }).ToList(); //var fullNames = await _context.Users.ToListAsync(); ViewData["Id"] = new SelectList(await _context.Users.ToListAsync(), "Id", "FullName"); //ViewData["Id"] = _context.Users.Select(u => u.FullName).ToList(); ViewData["ProvinciaId"] = new SelectList(_context.Provincias, "ProvinciaId", "Nombre"); ViewData["MunicipioId"] = new SelectList(_context.Municipios, "MunicipioId", "Nombre"); ViewData["UbicacionId"] = new SelectList(_context.Ubicaciones, "UbicacionId", "Nombre"); //ViewData["Id"] = new SelectList(_context.Users, "Id", "FullName", resolucion.Id); //ViewData["UsersId"] = new SelectList(_context.Users.ToList(), "Id", "FullName", carpeta.Id); //ViewData["UsersId"] = new SelectList(_context.Users.ToList(), "Id", "FullName"); if (carpeta == null) { return NotFound(); } return View(carpeta); }

    el problema esta en esta linea 

    ViewData["Id"] = new SelectList(await _context.Users.ToListAsync(), "Id", "FullName");

    y la verdad no se por que, intente de varias formas pero no logra seleccionar el valor del Id



    • Editado SOLARONE(1) domingo, 9 de diciembre de 2018 16:46
    domingo, 9 de diciembre de 2018 16:34
  • Hola, has probado a no usar async en dicha línea de código ?

     ViewData["Id"] = new SelectList(_context.Users, "Id", "FullName");

    Puede ser que el problema sea un mal uso de la asincronia

    O usa el siguiente código modificado 

    ViewData["Id"] = new SelectList(await _context.Users.ToListAsync().ConfigureAwait(false), "Id", "FullName");


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


    domingo, 9 de diciembre de 2018 23:04
    Moderador
  • Sergio Parra, con las dos lineas de codigo que sugieres no da primero que no selecciona el Id y segundo cuando le doy actualizar me sigue redireccionando a una pagina en blanco. 

    si tu descargas este proyecto https://github.com/medhatelmasry/IdentityCore, y le añades una clase llamada Resolucion. 

    public class Resolucion
        {
            [Key]
            public int ResolcuionId { get; set; }
            [Required(ErrorMessage = "El campo IDCarpeta es obligatorio.")]
            [MaxLength(6)]
            [MinLength(6)]
            [RegularExpression("[TJCBCH]{1,2}[0-9]{1,4}", ErrorMessage = "El formato es incorrecto Ejm. TJ0125.")]
            public string IDCarpeta { get; set; }
            [Required(ErrorMessage = "El campo Predio es obligatorio.")]
            public string AgrupacionSocial { get; set; }
            [Required(ErrorMessage = "El campo Poligono es obligatorio.")]
            //[RegularExpression("^[0-9]$", ErrorMessage = "...")]
            [Range(0, 9, ErrorMessage = "...")]
            public int Poligono { get; set; }
            [Required(ErrorMessage = "El campo Expediente es obligatorio.")]
            public string Expediente { get; set; }
            [Required]
            public string ClaseResolucion { get; set; }
            [Required]
            public string TipoResolucion { get; set; }
            public DateTime FechaRegistro { get; set; }
            [ForeignKey("ApplicationUser")]
            public string Id { get; set; }
            public ApplicationUser ApplicationUser { get; set; }
        }
    y le creas su Controlador de forma (Controlador de MVC con vistas que usan Entity Framework), de igual forma te redirecciona a una pagina en blanco cuando tu editas un dato, pero cuando tu tienes una clase X que no esta relacionado con Identity pues funcina de marabilla. 

    Si tu quieres subo mi proyecto a Git para que lo veas.
    • Editado SOLARONE(1) domingo, 9 de diciembre de 2018 23:28
    domingo, 9 de diciembre de 2018 23:23
  • Hola. Viendo tu código te recomiendo que pongas un punto de ruptura al inicio de la acción de edición y vayas paso a paso. Sobre todo pon un punto de ruptura en tu bloque catch. Veo que haces cosas y luego redireccionas. Pondría un catch capturando un Exception para ver si se produce un error que ko sea DbUpdateConcurrencyException... 

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

    domingo, 9 de diciembre de 2018 23:30
    Moderador
  • es aqui donde ingresa cuando le doy actualizar 

     if (id != carpeta.CarpetaId)
                {
                    return NotFound();
                }

    por que el id=0 y no a 1, el culpable como vuelvo a indicar es esta linea de codigo

    ViewData["Id"] = new SelectList(_context.Users, "Id", "FullName");


    domingo, 9 de diciembre de 2018 23:34
  • Hola, habría que ver el código de la vista del Get de la edición. Y ver cómo realizas el POST para enviar tanto el identificador como los demás datos... 

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

    domingo, 9 de diciembre de 2018 23:46
    Moderador
  • Hola, entonces quieres que se seleccione el id directamente? En tu Get podrías poner

     ViewData["Id"] = new SelectList(await _context.Users.ToListAsync(), "Id", "FullName", id); // especificar id como selectedvalue


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

    domingo, 9 de diciembre de 2018 23:56
    Moderador
  • Aqui esta mi codigo haber si lo pruebas 

    https://github.com/tuxgentoo/INRAMVCDatPredWebCore 

    con el codigo que indicas nada no da, es por eso que tenia como carpeta.Id no se si te acuerdas.

    lunes, 10 de diciembre de 2018 0:07
  • Una observación el (id) es de la edición que esta tanto en el Get como en el Post y no así Id que es del Usuario son dos cosas diferentes es por eso que antes tenia carpeta.Id por que la clase Carpeta tiene una relación con ApplicationUser el cual esta heredando de IdentityUser el cual contiene el Id. 

    lunes, 10 de diciembre de 2018 0:16
  • Hola. Has verificado en tu bbdd que tienes informado el campo id de usuario en la tabla carpeta? Lo digo porque tal vez el problema venga en el Create carpeta. 

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

    lunes, 10 de diciembre de 2018 0:34
    Moderador
  • informado? cuando Creo una carpeta anda bien crea bien ahi no hay problema incluso inserta el Id de usuario el problema esta con la edicion. todo funciona bien ecepto la edicion.
    lunes, 10 de diciembre de 2018 0:37
  • Hola, que valor tiene el campo Id (userId) al ejecutar esta línea?

    var carpeta = await _context.Carpetas.FindAsync(id);


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

    lunes, 10 de diciembre de 2018 0:52
    Moderador
  • Sergio, creo que no nos estamos entendiendo xd, el Id

    lunes, 10 de diciembre de 2018 1:01
  • Vale viene un identificador, pero ese identificador de usuario existe en la tabla de usuarios? Si haces

     var carpeta = await _context.Carpetas. Include(user => user.ApplicationUser).FindAsync(id);
    

    Te trae relleno el objeto ApplicationUser ? 


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

    lunes, 10 de diciembre de 2018 1:21
    Moderador
  • no entiendo por que me indicas o observas eso cuando en realidad eso esta bien 

    var carpeta = await _context.Carpetas. Include(user => user.ApplicationUser).FindAsync(id);

    ese codigo que me indicas que coloque me trae error 

    cuando en realidad el problema esta en esta linea de codigo 

    ViewData["Id"] = new SelectList(_context.Users.ToList(), "Id", "FullName");

    lunes, 10 de diciembre de 2018 2:04
  • Hola. Por qué dices que el error está en esa línea? Paso a comentar lo que estoy entendiendo en nuestra conversación. Existen carpetas asociada a usuarios. Al darle a editar carpeta se te abre una vista con la información a editar. Luego ejecutas la edición. En ese viewbag["id"] almacenas los usuarios para mostrar un combo desplegable en la vista de edición. Se supone que ese combo debe seleccionarse automáticamente el usuario de esa carpeta. Tu problema es que ese combo no está seleccionado el  usuario . Estoy en lo cierto? 


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

    lunes, 10 de diciembre de 2018 2:12
    Moderador
  • no entiendo por que me indicas o observas eso cuando en realidad eso esta bien 

    var carpeta = await _context.Carpetas. Include(user => user.ApplicationUser).FindAsync(id);

    ese codigo que me indicas que coloque me trae error 

    cuando en realidad el problema esta en esta linea de codigo 

    ViewData["Id"] = new SelectList(_context.Users.ToList(), "Id", "FullName");

    Lo que quiero con esta respuesta mía es saber si existe el usuario de la carpeta. 

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

    lunes, 10 de diciembre de 2018 2:13
    Moderador
  • exacto 
    lunes, 10 de diciembre de 2018 2:21
  • pues existe el usuario si yo quitara ese viewbag["id"]  ojo que no es id es Id con mayuscula, se ejecuta bien la actualizacion.
    lunes, 10 de diciembre de 2018 2:22
  • Y si Renombra tanto el campo Id de Carpeta a digamos UserId y el ViewBag lo pones como UserId? Cambia también la vista. Lo digo por no confundir Id con id. A veces qmrste ejercicio de Renombrar las cosas ayuda a resolver este tipo de errores 


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

    • Marcado como respuesta SOLARONE(1) lunes, 10 de diciembre de 2018 2:48
    lunes, 10 de diciembre de 2018 2:28
    Moderador
  • Ahora si, gracias amigo Sergio por la ayuda me dio mucho dolor de cabeza xd, que raro pero que sea eso.

    ViewData["UserId"] = new SelectList(_context.Users, "Id", "FullName", carpeta.UserId);

    con el siguiente cambio en la clase carpeta 

    public class Carpeta
        {
            [Key]
            public int CarpetaId { get; set; }
            [Required(ErrorMessage = "El campo IDCarpeta es obligatorio.")]
            [MaxLength(6)]
            [MinLength(6)]
            [RegularExpression("[TJCBCH]{1,2}[0-9]{1,4}", ErrorMessage = "El formato es incorrecto Ejm. TJ0125.")]
            public string IDCarpeta { get; set; }
            [Required(ErrorMessage = "El campo AgrupacionSocial es obligatorio.")]
            public string AgrupacionSocial { get; set; }
            [Required]
            [Range(1, short.MaxValue, ErrorMessage = "El valor {0} debe ser numérico.")]
            public int Cuerpos { get; set; }
            [Required]
            [Range(1, short.MaxValue, ErrorMessage = "El valor {0} debe ser numérico.")]
            public int Fojas { get; set; }
            [Required(ErrorMessage = "El campo Poligono es obligatorio.")]
            public int Poligono { get; set; }
            [Required]
            public DateTime FechaRegistro { get; set; }
            //public List<Predio> Predios { get; set; }
            [Required]
            [ForeignKey("Departamento")]        
            public int DepartamentoId { get; set; }
            public Departamento Departamento { get; set; }
            [ForeignKey("Provincia")]        
            public int? ProvinciaId { get; set; }
            //[Required]
            public Provincia Provincia { get; set; }
            [ForeignKey("Municipio")]        
            public int? MunicipioId { get; set; }        
            public Municipio Municipio { get; set; }
            [ForeignKey("ApplicationUser")]
            public String UserId { get; set; }
            public ApplicationUser ApplicationUser { get; set; }
            [ForeignKey("Ubicacion")]        
            public int UbicacionId { get; set; }
            public Ubicacion Ubicacion { get; set; }
        }



    • Editado SOLARONE(1) lunes, 10 de diciembre de 2018 2:49
    lunes, 10 de diciembre de 2018 2:48