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

ここで 2 つのことを行います。これを自分でレンダリングするのはやめてください。jQuery を使用してください。「jquery メニュー」を Google で検索すると、何百ものリンクが見つかります。

次に、アプリに順序付けロジックを配置します。これを実行するために DB は必要ありません。これは、DB がサイクルを吸収し、(私が読んだことから) あまり効率的ではないためです。これは、Linq が最適な自己参照結合を使用した単純なループ ロジックです。

これを jQuery に渡してください。コードに HTML をハードコーディングせずに問題ありません:)

于 2009-04-28T18:28:22.453 に答える
0

私は常に再帰的なテーブル値関数を使用して、SQL サーバーで階層データをフェッチします。

ここで例を参照してください: blogs.conchango.com/christianwade/archive/2004/11/09/234.aspx

残念ながら、SQL Server ユーザー定義関数 (UDF) とストアド プロシージャには再帰制限 (最大 32 レベル) があります。

注: テーブル値関数を使用する場合は、それを dbml ファイルにドロップするだけで、他のテーブルと同じようにアクセスできるようになります。

もう 1 つの方法は、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 に答える