Aller au contenu principal

👹 Boss: Session Master

Bien que simple, il y a quelques lacunes dans l'implémentation actuelle de la session.

  1. Lors de l'ajout au panier, faites en sorte que si l'item ajouté au panier n'existe pas dans la base de données, de retourner BadRequest().

    [HttpPost]
    public async Task<IActionResult> Create(PanierItemViewModel panierItem)
    {
    // 1. Vérifier que l'item à ajouter au panier existe bien (dans la bd)!

    // 2. S'il est null, retourner `BadRequest()`

    string itemSerialized = JsonSerializer.Serialize(panierItem);
    HttpContext.Session.SetString("panier", itemSerialized);

    return Ok();
    }
    astuce

    Vous aurez besoin de votre service d'événement! Ce service devrait déjà contenir une fonction vous permettant d'obtenir un événement par son id.

  2. Lors de l'ajout d'un item au panier, faites en sorte de rediriger vers l'action Index du panier plutôt que de retourner Ok().

    astuce

    Utilisez la fonction RedirectToAction(). Cette dernière prend deux arguments:

    • Le nom d'une action
    • Le nom d'un contrôleur
  3. Dans la vue Index du panier, ajoutez un bouton, lié à une nouvelle action du contrôleur, qui permet de vider le panier.

    astuce
    • Vous pouvez utiliser un bouton dans un formulaire, effectuant une requête POST vers une nouvelle action du contrôleur Panier.
    • Comme vous aurez deux actions POST dans le même contrôleur, vous devrez donner à cette nouvelle action une URL différente. La façon la plus facile est de prendre le nom de l'action lors de la définition de la route. Par exemple:
      [HttpPost("[action]")]
    • La fonction HttpContext.Session.Remove() permet de retirer une clé en particulier de la session.
  4. Lorsqu'on récupère l'item du panier dans Index(), il n'y a seulement qu'un id dans le ViewModel. C'est normal, on ne veut pas stocker toutes les informations du produit dans le cookie (il y a une limite de taille au cookie!). Cependant, lors de l'affichage du panier, il nous faut ces informations supplémentaires, comme le nom de l'évéenement.

    1. Créez une propriété optionnelle Evenement? evenement dans PanierViewModel pour contenir l'événement derrière l'item de panier.
    2. Dans Index() récupérez le détail de l'événement à partir de son id contenu dans le panier. Assignez l'événement à la propriété optionnelle du ViewModel
      public async Task<IActionResult> Index()
      {
      var panier = HttpContext.Session.GetString("panier");

      if (panier != null)
      {
      var panierItem = JsonSerializer.Deserialize<PanierItemViewModel>(panier);
      if (panierItem != null)
      {
      // Récupérer le détail de l'événement et assignez-le à la propriété optionnelle du `ViewModel`.
      }

      return View(panierItem);
      }

      return View();
      }
    astuce

    Vous aurez besoin de votre service d'événement! Ce service devrait déjà contenir une fonction vous permettant d'obtenir un événement par son id.

    1. Assurez-vous d'être en mesure d'afficher quelques informations sur l'événement dans le panier. img

level up