es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Operación CRUD con el uso del Framework de identidad en ASP.NET Core MVC.

Soy nuevo en ASP.NET Core MVC. Tengo que hacer un proyecto en el cual se creen múltiples cuentas de usuario y cada usuario cree su propio “Todo” con operaciones CRUD. Cada usuario debería poder ver su propia página de listado de “Todo”.

Para esto, utilicé el marco de identidad. He realizado este trabajo hasta ahora.

¿Cómo agregar tablas y relaciones a una base de datos de identidad generada por ASP.NET Core MVC?

Mi código muestra todos los listados de “Todo” en cada inicio de sesión de usuario. Por favor, guíame sobre cómo hacer que cada usuario vea y maneje su propio “Todo”.

Este es mi código:

public async Task<iactionresult> Index()
{
    return View(await _context.Activities.ToListAsync());
}

[Authorize]
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<iactionresult> Create([Bind("Id,Description")] Activities activities)
{
    if (ModelState.IsValid)
    {
        _context.Add(activities);
        await _context.SaveChangesAsync();
        return RedirectToAction(nameof(Index));
    }

    return View(activities);
}

[Authorize]        
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<iactionresult> Edit(int id, [Bind("Id,Description")] Activities activities)
{
    if (id != activities.Id)
    {
        return NotFound();
    }

    if (ModelState.IsValid)
    {
        try
        {
            _context.Update(activities);
            await _context.SaveChangesAsync();
        }
        catch (DbUpdateConcurrencyException)
        {
            if (!ActivitiesExists(activities.Id))
            {
                return NotFound();
            }
            else
            {
                throw;
            }
        }

        return RedirectToAction(nameof(Index));
    }

    return View(activities);
}

(Note: I have assumed that “Todo” refers to a model called “Activities” as it is not mentioned in the given code)

Tags:  

Answer

  1. Avatar for davy.ai

    Para asegurarse de que cada usuario conectado solo pueda ver y operar en su propia lista de tareas pendientes, deberá modificar su código para filtrar los datos de la lista de tareas pendientes en función del ID del usuario conectado actualmente.

    Una forma de hacer esto sería agregar una nueva migración a la base de datos y agregar una relación de clave externa a la tabla Activities vinculándola a la tabla AspNetUsers.

    Luego, en su acción Index, modifique la consulta para que solo devuelva Activities donde el UserId coincida con el ID del usuario conectado actualmente:

    public async Task<iactionresult> Index()
    {
      // Obtener el ID del usuario conectado actualmente
      var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
    
      // Filtrar las actividades por ID de usuario
      var activities = await _context.Activities
        .Where(a => a.UserId == userId)
        .ToListAsync();
    
      return View(activities);
    }
    

    De manera similar, en sus acciones Create y Edit, deberá establecer la propiedad UserId de las Activities nuevas o actualizadas en el ID del usuario conectado actualmente, de la siguiente manera:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<iactionresult> Create([Bind("Id,Description")] Activities activities)
    {
      if (ModelState.IsValid)
      {
        // Obtener el ID del usuario conectado actualmente
        var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
    
        // Establecer la propiedad UserId de la nueva actividad en el ID del usuario conectado actualmente
        activities.UserId = userId;
    
        _context.Add(activities);
        await _context.SaveChangesAsync();
        return RedirectToAction(nameof(Index));
      }
    
      return View(activities);
    }
    
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<iactionresult> Edit(int id, [Bind("Id,Description")] Activities activities)
    {
      if (id != activities.Id)
      {
        return NotFound();
      }
    
      if (ModelState.IsValid)
      {
        try
        {
          // Obtener el ID del usuario conectado actualmente
          var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
    
          // Establecer la propiedad UserId de la actividad actualizada en el ID del usuario conectado actualmente
          activities.UserId = userId;
    
          _context.Update(activities);
          await _context.SaveChangesAsync();
        }
        catch (DbUpdateConcurrencyException)
        {
          if (!ActivitiesExists(activities.Id))
          {
            return NotFound();
          }
          else
          {
            throw;
          }
        }
    
        return RedirectToAction(nameof(Index));
      }
    
      return View(activities);
    }
    

    Con estas modificaciones, cada usuario conectado solo debería ver y poder operar en su propia lista de tareas pendientes.

Comments are closed.