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

时间:2012-03-12 20:12:47

标签: 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 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; }
}

然后我有一个递归函数,将任何List吐出到嵌套的ul标签(用作菜单)。现在,ListItem可以通过直接完整的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并生成支持它的路由的好方法是什么(如果需要,我可以更改ListItem类)?在这种情况下,如何构建他们的视图/控制器呢?我不确定如何继续增加深度,因为我只是真正开发了我硬编码路由的MVC应用程序,或者只是使用了默认的控制器/动作路径,但现在我正在尝试使其更多数据驱动的

1 个答案:

答案 0 :(得分:1)

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

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

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