1

我将下面的代码用作 HTMLHelper,它从数据库中获取数据并循环显示菜单。正如您所看到的,这相当简单,但是,如果您有一个使用相邻层次结构模型的数据库表,例如/ID、ParentID、OrderID,该怎么办。很容易看到发生了什么,但需要递归才能正确获取这些数据。编写 C# 递归函数是否可以接受?如果是这样,有人可以帮我吗?预期的输出与此类似..

<ul>
  <li>Item1
    <ul>
      <li>SubItem1</li>
    </ul>
  </li>
</ul>

SQL 2008 现在有一个 Hierarchy 数据类型,所以我不确定这是否会有所帮助?

我还希望通过某种方式使用户能够决定菜单中的内容,例如,可以进入菜单的项目列表,然后选择这些项目及其在层次结构中的位置。一旦按下保存的按钮,它将将此层次结构存储在数据库中。

我是不是问得太多了,我敢肯定这一定是很常见的情况?

如果有人想使用它,这是我的 HTMLHelper 代码...

 public static string Menu(this HtmlHelper helper, int MenuCat)
{

    string menuHTML = "<ul id=\"menu\">";

    var route = helper.ViewContext.RequestContext.RouteData;
    string currentPageName = route.GetRequiredString("id");

    DB db = DB.CreateDB();

    //var result = from p in db.WebPages where p.CategoryID == 9 select p;
    var result = from p in db.WebPages select p;

    foreach (var item in result)
    {
        if (item.Name == currentPageName)
        {

            menuHTML += "\n\t<li>" + helper.ActionLink(item.Name, "Details", "Dinner", new { id = item.ID }, new { @class = "selected" }) + "</li>";
        }
        else
        {
            menuHTML += "\n\t<li>" + helper.ActionLink(item.Name, "Details", "Dinner", new { id = item.ID }, null) + "</li>";
        }
    }

    menuHTML += "\n</ul>\n";

    return menuHTML;


}
4

3 回答 3

1

我会在这里做两件事:不要自己渲染这个:使用 jQuery。如果你用谷歌搜索“jquery menu”,你会发现数百个链接。

接下来,将排序逻辑放在您的应用程序中,您不需要数据库来执行此操作,因为它会吸收周期并且(根据我所读到的)效率不是很高。这是一个带有自引用连接的简单循环逻辑,Linq 非常适合。

把它交给 jQuery,你最好不用在代码中硬编码 HTML :)

于 2009-04-28T18:28:22.453 回答
0

如果您使用的是 Sql server 2005,请查看 Common Table Expression (CTE)(带有 CTE 分层数据的谷歌)。它允许您创建一个显示完整层次结构的视图。

但是,您在菜单中显示了多少深度级别?通常,您只需要显示直接子项并在用户单击链接时在层次结构中向下移动。(不需要递归)

于 2009-04-28T18:48:55.150 回答
0

我总是使用递归表值函数来获取 SQL Server 中的分层数据。

在此处查看示例:blogs.conchango.com/christianwade/archive/2004/11/09/234.aspx

不幸的是,SQL Server 用户定义函数 (UDF) 和存储过程存在递归限制(最多 32 级)。

注意:如果您使用表值函数,只需将其放入您的 dbml 文件中,您就可以像访问任何其他表一样访问它。

另一种方法是使用 SQL Server 2005 中引入的新递归查询语法(以 WITH 子句和 Common Table Expressions-CTE 的形式)。

看看这里:www.eggheadcafe.com/articles/sql_server_recursion_with_clause.asp

这里介绍了一种将 CTE 与 Linq-To-SQL 混合的方法:stackoverflow.com/questions/584841/common-table-expression-cte-in-linq-to-sql

于 2009-06-23T14:52:50.990 回答