iT邦幫忙

2021 iThome 鐵人賽

DAY 28
0
Modern Web

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

【從實作學習ASP.NET Core】Day28 | 前台 | 管理我的訂單

已經做到爛掉的 CRUD 又來了,最後還是要把訂單管理的頁面建出來


我的訂單

沿用前面建立的 OrderController.cs 控制器
這次需要建立兩個 Action:

  • Index( ):顯示我的訂單
  • Details( ):訂單詳細資料

我的訂單列表

public async Task<IActionResult> Index()
{
    List<OrderViewModel> orderVM = new List<OrderViewModel>();
    var userId = _userManager.GetUserId(User);
    var orders = await _context.Order.
                    OrderByDescending(k => k.OrderDate).  //依照日期排序
                    Where(m => m.UserId == userId).ToListAsync();

    foreach(var item in orders)
    {
        item.OrderItem = await _context.OrderItem.
                            Where(p => p.OrderId == item.Id).ToListAsync();
        var vm = new OrderViewModel()
        {
            Order = item,
            CartItems = GetOrderItems(item.Id)
        };
        orderVM.Add(vm);
    }
    return View(orderVM);
}
private List<CartItem> GetOrderItems(int orderId)
{
    var OrderItems = _context.OrderItem.Where(p => p.OrderId == orderId).ToList();
    List<CartItem> orderItems = new List<CartItem>();
    foreach (var orderitem in OrderItems)
    {
        CartItem item = new CartItem(orderitem);
        item.Product = _context.Product.Single(x => x.Id == orderitem.ProductId);
        orderItems.Add(item);
    }
    return orderItems;
}

訂單詳細資料

可以比照前面在結帳流程顯示訂單的方式

public async Task<IActionResult> Details(int? Id)
{
    if (Id == null)
    {
        return NotFound();
    }

    var order = await _context.Order.FirstOrDefaultAsync(m => m.Id == Id);
    if (order.UserId != _userManager.GetUserId(User))
    {
        return NotFound();
    }
    else
    {
        order.OrderItem = await _context.OrderItem.
                            Where(p => p.OrderId == Id).ToListAsync();
        ViewBag.orderItems = GetOrderItems(order.Id);
    }
    return View(order);
}

導覽列

_Layout.cshtml 引用 SignInManager 來得知登入狀態

@using Microsoft.AspNetCore.Identity
@inject SignInManager<IdentityUser> SignInManager

加入選項,並設定只有在登入狀態下才看的到 [我的訂單] 選項

@if (SignInManager.IsSignedIn(User)){
    <li class="nav-item">
    <a class="nav-link text-dark" asp-controller="Order" asp-action="Index">我的訂單</a>
    </li>
}

到這裡前台該有的功能都完成了,鐵人賽也到尾聲了,剩下的天數就來慢慢收尾吧!


上一篇
【從實作學習ASP.NET Core】Day27 | 前台 | PayPal 訂單付款 (2)
下一篇
【從實作學習ASP.NET Core】Day29 | 補充 | 圖表 Chart.js
系列文
從實作學習ASP.NET Core - 30天的購物網站30

尚未有邦友留言

立即登入留言