我正试图改变这一点 Tutorial从表中读取数据。我通过添加Id键字段修改了NavigationMenu.cs模型:
public class NavigationMenu
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Text { get; set; }
public string Action { get; set; }
public string Controller { get; set; }
public string Icon { get; set; }
public bool Selected { get; set; }
public List<NavigationMenu> MenuChildren;
}
添加了一个上下文:
public class NavigationMenuContext : DbContext
{
public NavigationMenuContext() : base("name=DefaultConnection")
{
}
public DbSet<NavigationMenu> NavigationMenus { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
}
}
并修改了特定的控制器:
public class NavigationController : Controller
{
// GET: NewMenu
public ActionResult Index()
{
NavigationMenuContext navigationMenuContext = new NavigationMenuContext();
List<NavigationMenu> menuItems = navigationMenuContext.NavigationMenus.ToList();
return View(menuItems);
}
[ChildActionOnly]
public ActionResult GenerateMenu()
{
NavigationMenuContext navigationMenuContext = new NavigationMenuContext();
List<NavigationMenu> menuItems = navigationMenuContext.NavigationMenus.ToList();
string action = ControllerContext.ParentActionViewContext.RouteData.Values["action"].ToString() == "Index" ? "" : ControllerContext.ParentActionViewContext.RouteData.Values["action"].ToString();
string controller = ControllerContext.ParentActionViewContext.RouteData.Values["controller"].ToString();
foreach (var item in menuItems)
{
if (item.MenuChildren != null)
{
foreach (var cItem in item.MenuChildren)
{
if (cItem.Controller == controller && cItem.Action == action)
{
cItem.Selected = true;
break;
}
else
{
cItem.Selected = false;
}
}
}
if (item.Controller == controller && item.Action == action)
{
item.Selected = true;
break;
}
else
{
item.Selected = false;
}
}
return PartialView("~/Views/Shared/_Navigation.cshtml", menuItems);
}
}
但我无法通过二级菜单获得相同的结果: NavigationMenus Table
如何修改代码以在视图中渲染第二级menù?
答案 0 :(得分:0)
Hi this is the way you can achive what you want to do . I just added a line on OnMidelCreating and then testted the code woith
var result = context.MaineMenu.ToList(); // here I gold child menus in the list
public class NavigationMenuContext : DbContext
{
public NavigationMenuContext() : base("name=DefaultConnection")
{
}
public DbSet<NavigationMenu> NavigationMenus { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
-- this is changed --
modelBuilder.Entity<NavigationMenu>().HasMany(c => c.MenuChildren);
}
}
---在此之后,当我添加新的迁移时,迁移看起来像这样。 看到新的Id列和EF已添加外键。
public override void Up()
{
CreateTable(
"dbo.NavigationMenus",
c => new
{
Id = c.Int(nullable: false, identity: true),
Text = c.String(),
Action = c.String(),
Controller = c.String(),
Icon = c.String(),
Selected = c.Boolean(nullable: false),
NavigationMenu_Id = c.Int(),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.NavigationMenus", t => t.NavigationMenu_Id)
.Index(t => t.NavigationMenu_Id);
}
public override void Down()
{
DropForeignKey("dbo.NavigationMenus", "NavigationMenu_Id", "dbo.NavigationMenus");
DropIndex("dbo.NavigationMenus", new[] { "NavigationMenu_Id" });
DropTable("dbo.NavigationMenus");
}
SQL服务器中的数据和应用程序的输出
课程-----
public class SampleDbContext : DbContext
{
public SampleDbContext()
: base("name=SampleDBConnection")
{
this.Configuration.LazyLoadingEnabled = false;
}
public DbSet<NavigationMenu> MaineMenu { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Candidate>().HasMany(t => t.SkillSets).WithMany(t => t.Candidates)
.Map(m =>
{
m.ToTable("candidate_skillset");
m.MapLeftKey("candidate_id");
m.MapRightKey("skillset_id");
});
modelBuilder.Entity<SkillSet>().ToTable("skillset");
modelBuilder.Entity<Candidate>().ToTable("candidate");
modelBuilder.Entity<NavigationMenu>().HasMany(c => c.MenuChildren);
}
}
public class NavigationMenu
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public NavigationMenu()
{
MenuChildren = new Collection<NavigationMenu>();
}
public string Text { get; set; }
public string Action { get; set; }
public string Controller { get; set; }
public string Icon { get; set; }
public bool Selected { get; set; }
public ICollection<NavigationMenu> MenuChildren { get; set; }
}