1- EF Code First #8
2- مباحث تکمیلی مدلهای خود ارجاع دهنده در EF Code First
3- نگاهی به اجزای تعاملی Twitter Bootstrap
هدف از مطلب جاری نحوه نمایش منویهای چند سطحی میباشد، ابتدا مثال کامل زیر را در نظر بگیرید :
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Menu.Models.Entities { public class Category { public int Id { get; set; } public string Name { get; set; } public int? ParentId { get; set; } public virtual Category Parent { get; set; } public virtual ICollection<Category> Children { get; set; } } } public class MyContext : DbContext { public DbSet<Category> Category { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { // Self Referencing Entity modelBuilder.Entity<Category>() .HasOptional(x => x.Parent) .WithMany(x => x.Children) .HasForeignKey(x => x.ParentId) .WillCascadeOnDelete(false); base.OnModelCreating(modelBuilder); } }
هدف از این بحث، نحوه نمایش گروه محصولات داخل منو به صورت چند سطحی میباشد، جهت نمایش میبایست از تکنیک recursive function استفاده کنید، ابتدا در نظر داشته باشید که ساختار منوی تشکیل شده میبایست بدین صورت باشد :
این حالت میتواند تا n سطح پیش برود، حال نحوه نمایش در View مربوطه باید به صورت زیر باشد :
@using Menu.Helper @model IEnumerable<.Models.Entities.Category> @ShowTree(Model) @helper ShowTree(IEnumerable<Menu.Models.Entities.Category> categories) { foreach (var item in categories) { <li class="@(item.Children.Any() ? "dropdown-submenu" : "")"> @Html.ActionLink(item.Name, actionName: "Category", controllerName: "Product", routeValues: new { Id = item.Id, productName = item.Name.ToSeoUrl() }, htmlAttributes: null) @if (item.Children.Any()) { <ul> @ShowTree(item.Children) </ul> } </li> } }
یک نکته :
در خط 9 این مورد را که آیا آیتم جاری فرزندی دارد چک کرده ایم اگر داشته باشد کلاس dropdown-submenu را به li جاری اضافه میکند.