iT邦幫忙

2021 iThome 鐵人賽

DAY 23
1
Modern Web

從實作學習ASP.NET Core - 30天的購物網站系列 第 23

【從實作學習ASP.NET Core】Day23 | 前台 | Session 購物車 (1)

接下來要來做購物網站比較核心的內容了,從購物車到付款結帳內容比較多也比較連貫,這邊應該會多分幾天出來寫。今天會先完成 Session 購物車的前置作業。


購物車儲存方式

Http是無狀態的協定也就是說每一個網頁都是一個獨立的 Request ,但是購物車是需要跨頁面保存的機制,需要用一些方法來保存狀態,這邊列出一些常用的解決方式:

  • Cookie:資料儲存在客戶端,好處在於不會消耗伺服器資源,但因為資料會在客戶端暴露,可能會有安全性問題。
  • Session:資料儲存在伺服器端的記憶體,資料能有隱密性,但有如果太多人同時使用,可能會導致伺服器記憶體超載。
  • 資料庫:資料儲存在資料庫,資料安全也可以對購物習慣做追蹤,但是每次存取時間長會導致使用者體驗差,對伺服器的負擔也會很大。

從上面可以知道,每種方式各有利弊,應該要針對專案的型態來選擇適合的機制。
總和各項考量,我這邊會用 Session 來實作購物車

啟用 Session

要用到 Session 就必須要註冊服務
Startup.cs 加入紅框內的程式碼來啟用 Session 服務

SessionHelper

在專案裡新增一個 Helpers 資料夾 並新增 SessionHelper.cs 類別
這個類別可以幫助我們存取 Session 的內容

using Microsoft.AspNetCore.Http;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace OnlineShop.Helpers
{
    public static class SessionHelper 
    {
        //設定 Session 內容
        public static void SetObjectAsJson(this ISession session, string key, object value)
        {
            session.SetString(key, JsonConvert.SerializeObject(value));
        }
        
        //取得 Session 內容
        public static T GetObjectFromJson<T>(this ISession session, string key)
        {
            var value = session.GetString(key);
            return value == null ? default(T) : JsonConvert.DeserializeObject<T>(value);
        }
        
        //移除 Session 
        public static void Remove(this ISession session, string key)
        {
            session.Remove(key);
        }
    }
}

加入購物車按鈕

在做購物車之前,先來把連結購物車的按鈕做好
我們希望當點擊 [加入購物車] 按鈕能有一點回饋,但單純用 Alert 似乎又有點寒酸
這時候可以試試用 Toastr.js 來美化訊息欄

在前端引入 CDN 並加入 javascript:

<script src="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/2.1.4/toastr.min.js"></script>
<script>
    function ShowMessage() {
        toastr["success"]("商品已加入購物車!");
    }
</script>

在加入購物車的按鈕上 加上onclick="ShowMessage()"

<a class="stretched-link text-dark" onclick="ShowMessage()" 
    asp-controller="Cart" asp-action="AddtoCart" asp-route-Id="@item.product.Id">加入購物車</a>

當點擊 [加入購物車] 後,就會在頁面右上角顯示訊息

當然這時候的購物車還沒有任何作用,明天再繼續來把購物車功能和頁面完成。


上一篇
【從實作學習ASP.NET Core】Day22 | 前台 | 商品留言板
下一篇
【從實作學習ASP.NET Core】Day24 | 前台 | Session 購物車 (2)
系列文
從實作學習ASP.NET Core - 30天的購物網站30

尚未有邦友留言

立即登入留言