C# 对于嵌套的数据驱动菜单,具有复杂/嵌套路由的逻辑一致URL?

C# 对于嵌套的数据驱动菜单,具有复杂/嵌套路由的逻辑一致URL?,c#,asp.net-mvc,menu,routes,C#,Asp.net Mvc,Menu,Routes,我想知道当使用数据驱动的菜单结构时,人们如何处理应用程序的嵌套/复杂路由 我的数据驱动菜单有两个类: public class List : Entity { public virtual ICollection<ListItem> ListItems { get; set; } public string Name { get; set; } public string Description { get; set; } public ListTy

我想知道当使用数据驱动的菜单结构时,人们如何处理应用程序的嵌套/复杂路由

我的数据驱动菜单有两个类:

 public class List : Entity
{
    public virtual ICollection<ListItem> ListItems { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public ListType ListType { get; set; }

    public string UlTagCssClass { get; set; }
    public string UlTagCssID { get; set; }
}

 public class ListItem : Entity
{
    public virtual List List { get; set; }
    public virtual ListItem ParentItem { get; set; }
    public virtual ICollection<ListItem> ChildItems { get; set; }

    public int SortOrder { get; set; }
    public string Text { get; set; }
    public string Controller { get; set; }
    public string Action { get; set; }
    public string Url { get; set; }
}
公共类列表:实体
{
公共虚拟ICollection列表项{get;set;}
公共字符串名称{get;set;}
公共字符串说明{get;set;}
公共ListType ListType{get;set;}
公共字符串UltAGCSClass{get;set;}
公共字符串UlTagCssID{get;set;}
}
公共类ListItem:实体
{
公共虚拟列表{get;set;}
公共虚拟ListItem父项{get;set;}
公共虚拟ICollection子项{get;set;}
公共int排序器{get;set;}
公共字符串文本{get;set;}
公共字符串控制器{get;set;}
公共字符串操作{get;set;}
公共字符串Url{get;set;}
}
然后,我有一个递归函数,它将任何列表吐出到嵌套的
ul
标记(用作菜单)中。目前,
ListItem
可以通过直接向上的完整URL拥有URL,提供控制器和操作,或者根本不作为链接

然而,我遇到了一个问题,URL与菜单的层次结构不匹配,这是非常常见的做法,也是大多数人所期望的

例如,我有一个菜单层次结构,如:

  • 关于
  • 接触
    • 部门
      • 人力资源
      • 销售
所以现在我的顶级项目
Contact
.Controller=“Contact”
。它的子项
Departments
具有
.Controller=“Content”、.Action=“Departments”
。正如您所期望的,它的链接可以访问www.domain.com/Contact/Departments。但是我的第三级物品
Sales
现在有
.Controller=“Departments,.Action=“Sales”
。这使得链接www.domain.com/Departments/Sales在菜单的层次结构中没有意义


存储正确的URL并生成支持该URL的路由的好方法是什么(如果需要,我可以更改ListItem类)?在这种情况下,人们将如何构建视图/控制器?我不确定如何继续增加深度,因为我只开发过MVC应用程序,其中我硬编码了路线或只使用了默认的控制器/操作路线,但现在我正试图使其更具数据驱动性。

添加以下路线并在y之前添加它我们的默认路线:

通过拉入菜单列表并向下遍历列表,在应用程序启动时动态映射这些。 我宁愿不动态地映射这些,除非它们动态地改变 因为您需要可能不会动态创建的支持文件(视图等)

 routes.MapRoute("Contact", "Contact/{action}", 
                 new { controller = "Contact"});
 routes.MapRoute("Departments", "Contact/Departments/{action}", 
                 new { controller = "Departments"});

添加以下路线并将其添加到默认路线之前:

通过拉入菜单列表并向下遍历列表,在应用程序启动时动态映射这些。 我宁愿不动态地映射这些,除非它们动态地改变 因为您需要可能不会动态创建的支持文件(视图等)

 routes.MapRoute("Contact", "Contact/{action}", 
                 new { controller = "Contact"});
 routes.MapRoute("Departments", "Contact/Departments/{action}", 
                 new { controller = "Departments"});

为了正确理解这一点,我需要基本上将两个操作指向同一个视图,不是吗?因为联系人控制器上的Departments操作将指向与Departments控制器上的Index操作相同的页面?您将如何动态生成这些路由?很好,我不应该给出默认操作否则它会在不应该的时候采用这种方式,我会更新我的答案,这样我才能正确理解这一点,我基本上需要将两个操作指向同一个视图,不是吗?因为联系人控制器上的部门操作将指向与部门控制器上的索引操作相同的页面?你会如何动态生成这些路由?很好的调用,我不应该给它任何默认操作,否则它会在不应该的时候使用此路由,我会稍微更新我的答案