- 7 Màu
- about
- Ajax
- ảnh
- Ảnh b tháng 4
- Ảnh Bìa
- Ảnh bìa ca sĩ
- Ảnh bìa Facebook
- Ảnh bìa gái đẹp
- Ảnh bìa giáng sinh
- ảnh bìa liên minh huyền thoại
- Ảnh bìa năm mới
- Ảnh bìa tháng 10
- Ảnh bìa tháng 11
- Ảnh bìa tháng 12
- Ảnh bìa tháng 4
- Ảnh bìa tháng 8
- Ảnh bìa tháng 9
- Ảnh chế
- Ảnh chibi
- Ảnh Đẹp
- Ảnh động
- asp.net core
- ASP.NET Core Identity
- asp.net mvc
- backend
- Blogger Templates
- blogspot
- Brush
- Cafe Code
- Christmas
- Chữ nghệ thuật
- Chúc mừng năm mới
- Chuyện tình bác sĩ
- Cô Đơn
- Code
- css
- Dame
- Double Exposure
- Download
- Ebook
- EPPlus
- Faq
- File 3D
- flutter
- Font chữ
- Font chữ việt hóa
- frontend
- Fshare.vn
- Giáng sinh
- Hacker
- Hacking
- Halloween
- Hiệu ứng chữ
- Hình nền máy tính
- học javascript
- Hot Girl
- HTML - CSS - ?
- html/css
- Hướng dẫn cover ảnh bìa
- Hướng dẫn Photoshop
- javascript
- javascript dom
- Khung ảnh bìa
- Khung Hình
- Kĩ năng seo
- lập trình asp.net
- lập trình mobile
- Logo
- Mặt Nạ
- Mockup
- ngày nhà giáo Việt Nam
- Ngày phụ nữ
- Noel
- Phần Mềm
- Phiêu Lưu
- Phím tắt
- Photoshop
- PNG
- Pokémon
- PSD
- PSD 3D Text
- PSD ảnh bìa
- psd đường một chiều
- Seo
- service
- Soái Ca
- Sơn Tùng M-TP
- source code
- Stock Ảnh
- Sự kiện Blogger
- Tâm Trạng
- tản mạn
- Tất cả bài viết
- template
- template chuẩn seo
- templates đẹp
- Tết
- Tết trung thu
- Text Effect
- Thầy cô
- Thủ Thuật
- Thủ thuật Blogger
- Thủ thuật Facebook
- Thủ thuật Photoshop
- Tiện ích Blogger
- Tìm hiểu về Photoshop
- Tình Yêu
- Tutorial
- Typo
- Typography
- ui ux design
- Valentine
- Vector
- Video
Tạo menu nhiều cấp (Multi-Level Menus) trong ASP.NET Core MVC
Hôm nay mình sẽ hướng dẫn các bạn tạo menu nhiều cấp trong ASP.NET Core MVC, một chủ đề mà nhiều bạn rất mong mỏi khi mới làm quen với ASP.NET Core MVC.
Menu nhiều cấp, chẳng hạn như 2 cấp, 3 cấp,... có nhiều cách để xử lý, nhưng trong bài viết này, mình sẽ hướng dẫn các bạn tạo menu đa cấp mới 1 table trong database, nhưng vẫn đảm bảo phân cấp.
Với menu đa cấp, hay bạn có thể gọi là mega menu, với menu này ứng dụng rất nhiều trong bán hàng, hay một website chứa khá nhiều category.
Ok, và bây giờ chúng ta bắt đầu bài hướng dẫn.
Tiến hành
Bước 1: Tạo các thực thể với database được thiết kế như sau:
Trong code firts entity framwork core ta có các class sau để phục vụ cho việc Migration dữ liệu:
Entities:
public class CmsMegaMenu
{
public int Id { get; set; }
public string Name { get; set; }
public string Slug { get; set; }
public int? DisplayOrder { get; set; }
public DateTimeOffset CreatedOn { get; set; }
public DateTimeOffset? UpdatedOn { get; set; }
public Status Status { get; set; }
public List<CmsMegaMenuSub> CmsMegaMenuSub { get; set; }
}
public class CmsMegaMenuSub
{
public int Id { get; set; }
public string Name { get; set; }
public string Slug { get; set; }
public int? DisplayOrder { get; set; }
public DateTimeOffset CreatedOn { get; set; }
public DateTimeOffset? UpdatedOn { get; set; }
public Status Status { get; set; }
public int MenuId { get; set; }
public CmsMegaMenu CmsMegaMenu { get; set; }
public List<CmsMegaMenuSubItem> CmsMegaMenuSubItem { get; set; }
}
public class CmsMegaMenuSubItem
{
public int Id { get; set; }
public string Name { get; set; }
public string Slug { get; set; }
public int? DisplayOrder { get; set; }
public DateTimeOffset CreatedOn { get; set; }
public DateTimeOffset? UpdatedOn { get; set; }
public Status Status { get; set; }
public int MenuId { get; set; }
public CmsMegaMenuSub CmsMegaMenuSub { get; set; }
}
Configurations:
public class CmsMegaMenuConfiguration : IEntityTypeConfiguration<CmsMegaMenu>
{
public void Configure(EntityTypeBuilder<CmsMegaMenu> builder)
{
builder.ToTable("CmsMegaMenus");
builder.HasKey(x => x.Id);
builder.Property(x => x.Id).UseIdentityColumn();
builder.Property(x => x.Status).HasDefaultValue(Status.Active);
}
}
public class CmsMegaMenuSubConfiguration : IEntityTypeConfiguration<CmsMegaMenuSub>
{
public void Configure(EntityTypeBuilder<CmsMegaMenuSub> builder)
{
builder.ToTable("CmsMegaMenuSubs");
builder.HasKey(x => x.Id);
builder.Property(x => x.Id).UseIdentityColumn();
builder.Property(x => x.Status).HasDefaultValue(Status.Active);
builder.HasOne(x => x.CmsMegaMenu).WithMany(x => x.CmsMegaMenuSub).HasForeignKey(x => x.MenuId);
}
}
public void Configure(EntityTypeBuilder<CmsMegaMenuSubItem> builder)
{
builder.ToTable("CmsMegaMenuSubItems");
builder.HasKey(x => x.Id);
builder.Property(x => x.Id).UseIdentityColumn();
builder.Property(x => x.Status).HasDefaultValue(Status.Active);
builder.HasOne(x => x.CmsMegaMenuSub).WithMany(x => x.CmsMegaMenuSubItem).HasForeignKey(x => x.MenuId);
}
Ta gọi phương thức sau:
public IActionResult Index()
{
ViewBag.ListMegaMenu = _context.CmsMegaMenus.Where(n => n.Status == Status.Active)
.Include(n => n.CmsMegaMenuSub)
.ToList();
ViewBag.ListMegaMenuItem = _context.CmsMegaMenuSubs.Where(n => n.Status == Status.Active).Include(n => n.CmsMegaMenuSubItem).ToList();
return View();
}
Với View sau:
@model List<AlbayMart.Data.Entities.CmsMegaMenu>
<nav id="site-navigation" class="main-navigation sticky-active" role="navigation">
<ul id="primary-menu" class="menu nav-menu" aria-expanded="false">
<li id="menu-item-739" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-739 active">
<a href="#" class="vertical-main"><i class="fa fa-bars pr-3" aria-hidden="true"></i>Danh mục sản phẩm</a>
<ul class="sub-menu">
@foreach (CmsMegaMenu menu1 in ViewBag.ListMegaMenu)
{
if (menu1.CmsMegaMenuSub.Count() == 0)
{
<li id="menu-item-740" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1455">
<a href="#"><i class="fa fa-fire pr-2"></i>@menu1.Name</a>
</li>
}
else
{
<li id="menu-item-740" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-740">
<a href="#"><i class="fa fa-male pr-2"></i>@menu1.Name</a>
<i class="fa fa-angle-right menu-icn-right" aria-hidden="true"></i>
<ul class="sub-menu sub-menu-megaz">
@foreach (CmsMegaMenuSub menu2 in menu1.CmsMegaMenuSub)
{
<li id="menu-item-1454" class="menu-item menu-item-type-post_type menu-item-has-children menu-item-object-page menu-item-1454 megaz-menu-items">
<a href="#" class="mega-tite">@menu2.Name</a>
<ul class="sub-menu sub-megaz">
@foreach (CmsMegaMenuSubItem menu3 in menu2.CmsMegaMenuSubItem)
{
<li class="menu-megaz">
<a href="#">@menu3.Name</a>
</li>
}
</ul>
</li>
}
</ul>
</li>
}
}
</ul>
</li>
</ul>
</nav>
Lời kết
Tạo menu phân cấp có nhiều hướng và cách làm khác nhau, và tất nhiên trong các bài sau sẽ làm một bài tips với hướng đi hoàn toàn khác.
Hy vọng bài viết có ích với bạn. Chúc các bạn thành công.
By Hiếu Quốc.
Có lẽ bạn thích?
8 comments
Danh Mục
Blog Bạn Bè
Comments
Địa chỉ
52 Xô Viết Nghệ Tĩnh, Hải Châu, Đà Nẵng
đó lúc còn sv a học cái asp này nhiều, mà sau ra toàn chơi blogspot :v
ReplyDeleteMà anh đi mỗi Blogspot thôi hã anh
Deletecòn mấy cái khác như Wp hay PHP cũng biết chút ít.
DeleteQuá được luôn anh ơi 🙌
DeleteHí nhô :v
ReplyDeleteLô bác :v
DeleteThống kê nhìn quen quen
ReplyDeleteTham khảo một chút css của anh zai 🤣
Delete