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

标签 c# asp.net-mvc entity-framework poco data-driven

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

相关文章:

c# - ASP.NET 使用 javascript 获取控件列表中每个控件的 ID

c# - 简单类型的只读自动属性 ​​: Initializer VS Expression Body Getter

c# - 带有 IIS 6 的 MVC

javascript - 调整图像客户端的大小并将其与表单数据一起传递给 asp mvc Controller

entity-framework - Entity Framework 报告循环引用,但没有任何意义

c# - EF Core HasQueryFilter 仅适用于过滤器表达式中的第一个值

c# - 在 C# 4.0 中实现即发即弃方法的最简单方法

c# - 复选框事件处理

c# - 从列表中删除项目 ASP.NET MVC

c# - 绕过 Controller 中的模型验证?