gpt4 book ai didi

c# - 从硬编码模型到数据驱动菜单

转载 作者:太空宇宙 更新时间:2023-11-03 15:09:44 24 4
gpt4 key购买 nike

我正在尝试改变它 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);
}
}

并修改了具体的 Controller :

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

如何修改代码以在 View 中呈现二级菜单?

最佳答案

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 Server 中的数据和应用程序的输出

enter image description here

类 -----

    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; }

}

关于c# - 从硬编码模型到数据驱动菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41763265/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com