【从实作学习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>
}

到这里前台该有的功能都完成了,铁人赛也到尾声了,剩下的天数就来慢慢收尾吧!


<<:  Angular 深入浅出三十天:表单与测试 Day25 - 测试进阶技巧 - DI 抽换

>>:  Day28 简易小键盘小实作3

Day16 - Ajax 加上 Antiforgery Token (一)

这篇内容延续上一篇的部份,来加上 Antiforgery Token 的给定及验证 ! Case01...

17.unity显示/隐藏物件(SetActive)

想要制作一个假背包,利用按钮显示背包,再按下按钮关闭背包。 要使用GameObject.SetAct...

[Day 14 - 小试身手] 用HTML、CSS、JS打造个人网站 (1)

所有的网站大概可以分成两类:静态网页、动态网页,静态网页顾名思义就是静止的网页,不会去太频繁的更新内...

启动专案 (Docker)

启动 Laravel 专案前的环境设置还是挺麻烦的,不过目前 Laravel 官方指南的安装方式变成...

[Day 22] - 『转职工作的Lessons learned』 - GraphQL (Hasura) - Apollo Client

GraphQL (Hasura)系列,忘记介绍最一开始从前端连线到GraphQL (Hasura)一...