今天來完成加入與刪除購物車以及送出訂單的部分,那麼就來吧!
在寫AddCar()
動作方法前,我們回顧一下在Home/Index
的View裡面,「加入購物車」的連結是如何寫的:
<a href="@Url.Action("AddCar","Member")?ProductId=@item.ProductId" class="btn btn-primary">加入購物車</a>
可以看到,加入產品到購物車時會攜帶一個ProductId
參數,因此AddCar()
寫法應該會像這樣:
public ActionResult AddCar(string ProductId)
{
......
}
此外,在加入產品至購物車時,要考量的是購物車是否已經有同樣產品,如果沒有的話須新增全新一筆訂單明細資料,有的話只需要增加數量即可。完整Code如下:
public ActionResult AddCar(string ProductId)
{
//取得目前通過驗證的使用者名稱
string userId = User.Identity.Name;
//取得該使用者目前購物車內是否已有此商品,且尚未形成訂單的資料
var currentCar = db.table_OrderDetail
.Where(m => m.ProductId == ProductId && m.IsApproved == "否" && m.UserId == userId).FirstOrDefault();
if (currentCar == null)
{
//如果篩選條件資料為null,代表要新增全新一筆訂單明細資料
//將產品資料欄位一一對照至訂單明細的欄位
var product = db.table_Product.Where(m => m.ProductId == ProductId).FirstOrDefault();
var orderDetail = new table_OrderDetail();
orderDetail.UserId = userId;
orderDetail.ProductId = product.ProductId;
orderDetail.Name = product.Name;
orderDetail.Price = product.Price;
orderDetail.Quantity = 1;
orderDetail.IsApproved = "否";
db.table_OrderDetail.Add(orderDetail);
}
else
{
//如果購物車已有此商品,僅需將數量加1
currentCar.Quantity++;
}
//儲存資料庫並導至購物車檢視頁面
db.SaveChanges();
return RedirectToAction("ShoppingCar");
}
完成後可以試看看加入購物車按鈕功能是否正確運作,隨意加入商品至購物車後,呈現畫面如下:
同樣在寫DeleteCar()
動作方法前,我們回顧一下在Member/ShoppingCar
的View裡面,「刪除購物車」的連結是如何寫的:
攜帶的參數是Id,此為產生購物車訂單明細時會自動編的流水號。另外要刪除資料用的是Remove()
方法,所以撰寫Code如下:
public ActionResult DeleteCar(int Id)
{
var orderDetails = db.table_OrderDetail.Where(m => m.Id == Id).FirstOrDefault();
db.table_OrderDetail.Remove(orderDetails);
db.SaveChanges();
return RedirectToAction("ShoppingCar");
}
完成後可以確認刪除購物車功能是否正常,在加入產品至購物車後,按刪除購物車會跳出提示視窗,按下確定後即刪除。
今天最後來完成送出訂單的部分,流程是在所有商品加入購物車完畢後,須先填寫訂單收件人資料,然後按下「確認訂購」就可以形成訂單。首先回憶一下昨天撰寫關於訂單收件人資料表單的View Code:
<form action="@Url.Action("ShoppingCar")" method="post">
<div class="form-horizontal">
<h4>填寫訂單收件人資料</h4>
<hr />
<div class="form-group">
<span class="control-label col-md-2">收件人姓名</span>
<div class="col-md-10">
<input type="text" id="Receiver" name="Receiver" required="required" class="form-control" />
</div>
</div>
<div class="form-group">
<span class="control-label col-md-2">收件人信箱</span>
<div class="col-md-10">
<input type="email" id="Email" name="Email" required="required" class="form-control" />
</div>
</div>
<div class="form-group">
<span class="control-label col-md-2">收件人地址</span>
<div class="col-md-10">
<input type="text" id="Address" name="Address" required="required" class="form-control" />
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="確認訂購" class="btn btn-default" />
</div>
</div>
</div>
</form>
為了對應View的form表單,這邊我們撰寫ShoppingCar()
的POST方法,表單送出後,需將此筆訂單加入至訂單資料表table_Order
。
另外,也需一併更新訂單明細資料表table_OrderDetail
內容,這裡需更新的是OrderGuid
(訂單編號)與IsApproved
(是否形成訂單)欄位。
所以在MemberController
內加入Code如下:
[HttpPost]
public ActionResult ShoppingCar(string Receiver, string Email, string Address)
{
string userId = User.Identity.Name;
string guid = Guid.NewGuid().ToString(); //產生隨機訂單編號
//加入訂單至 table_Order 資料表
var order = new table_Order();
order.OrderGuid = guid;
order.UserId = userId;
order.Receiver = Receiver;
order.Email = Email;
order.Address = Address;
order.Date = DateTime.Now;
db.table_Order.Add(order);
//訂單加入後,需一併更新訂單明細內容
var carList = db.table_OrderDetail.Where(m => m.IsApproved == "否" && m.UserId == userId).ToList();
foreach (var item in carList)
{
item.OrderGuid = guid;
item.IsApproved = "是";
}
db.SaveChanges();
return RedirectToAction("OrderList");
}
上述完成後,因為還沒有寫OrderList()
的方法,所以送出表單後會顯示錯誤,我們明天再來將最後的部分完成,明天見啦~