-2

これは私のデータベーステーブルです

DB テーブル

サイトマップを生成するには?

コントローラーはカテゴリー

アクションはIDです

それはそれのように見えます

ページ


TreeMenu.cs:

using System;
using System.Collections.Generic;

namespace Pmvc.Models
{
    public partial class TreeMenu
    {
        public int TreeId { get; set; }
        public int TreeParentId { get; set; }
        public string TreeName { get; set; }
        public List<TreeMenu> Children { get; set; }
    }

}

StoreDetailsDynamicNodeProvider.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using MvcSiteMapProvider.Extensibility;
using Pmvc.Models;


namespace Pmvc
{
    public class StoreDetailsDynamicNodeProvider : DynamicNodeProviderBase
    {
        PMVCEntities pmvcDB = new PMVCEntities();
        public override IEnumerable<DynamicNode> GetDynamicNodeCollection()
        {

            var nodes = new List<DynamicNode>();

            foreach (var treemenu in pmvcDB.TreeMenu)
            {
                nodes.Add(CreateNode(treemenu));
            }

            return nodes;
        }

        private DynamicNode CreateNode(TreeMenu treemenu)
        {

            DynamicNode node = new DynamicNode();
            node.Action = "ProductDetails";
            node.Controller = "Product";
            node.Title = treemenu.TreeName;

            if (treemenu.Children != null)
            {
                foreach (var child in treemenu.Children)
                {
                    node.Children.Add(CreateNode(child)); //This line is wrong!
                }
            }
            return node;

        }

    }


}

違う:

「MvcSiteMapProvider.Extensibility.DynamicNode」には「子」定義が含まれておらず、拡張メソッド「子」が見つかりません


public class StoreDetailsDynamicNodeProvider : DynamicNodeProviderBase 
    {
        PMVCEntities pmvcDB = new PMVCEntities();
        public override IEnumerable<DynamicNode> GetDynamicNodeCollection()
        {
            // Build value 
            var returnValue = new List<DynamicNode>();

            // Create a node for each album 
            foreach (var treemenu in pmvcDB.TreeMenu)
            {
                DynamicNode node = new DynamicNode();
                node.Action = "ProductDetails";
                node.Controller = "Product";
                node.Title = treemenu.TreeName;
                node.RouteValues.Add("id", treemenu.TreeId);
                returnValue.Add(node);
            }

            // Return 
            return returnValue;
        } 
    }

これは私のテーブルです

TreeId TreeParentId TreeName

1 0 カテゴリー1

2 1 メニュー項目 X

3 1 メニュー項目 Y

4 1 メニュー項目 Z

5 0 カテゴリー2

6 5 その他のメニュー 1

7 5 その他のメニュー 2

8 0 空のカテゴリ

9 7 メニュー Lv3

子ノードのコードはどのように記述すればよいですか?

4

1 に答える 1

1

MvcSitemap プロバイダーを見てください。データベースから読み取る動的プロバイダーを作成するのは非常に簡単です。

編集 - ドキュメントを読んだり、何かを実装しようとしたりしましたか? 彼らのサイトからほぼそのままコピーされました:

サイトマップ構成ファイル内で、必要に応じて動的ノードを追加します。

<mvcSiteMapNode 
    title="Details" 
    action="Details"   
    dynamicNodeProvider="MyProjectName.MyDynamicNodeProvider, MyProjectName" />

次に、実際のノード プロバイダーを記述します。

public class MyDynamicNodeProvider
    : DynamicNodeProviderBase 
{
    public override IEnumerable<DynamicNode> GetDynamicNodeCollection() 
    {
        // Build value 
        var returnValue = new List<DynamicNode>();

        // ... Here, get values from your database and build up
        // the list of nodes.  They can be in a tree structure
        // too since it appears that's how your data is - just
        // build the nodes in that way with sub-lists.

        // Return 
        return returnValue; 
    } 
}

以上です。

編集 2 - 他の回答に対処します。

あなたが提供したコードは、ツリー構造を平坦化します。元の投稿で、すでにツリー構造を印刷できることを示しました。ビューに含まれていたコードが何であれ、深さ優先トラバーサルの同じ原則を適用できます。

これがモックアップであり、実際のコードではない場合に備えて、深さ優先トラバーサルを示す簡単な疑似コードを次に示します。

public override IEnumerable<DynamicNode> GetDynamicNodeCollection() 
{
    // Build value 
    var nodes = new List<DynamicNode>();

    // Get all categories without parents.
    var rootCategories = db.GetRootCategories();  

    // Loop all root level categories, creating a node for each and adding
    // to the return value.
    foreach (var category in rootCategories)
    {
        nodes.Add(CreateNode(category));
    }
    return nodes;
}

private DynamicNode CreateNode(Category category)
{
    // Create a new node for the category
    DynamicNode node = new DynamicNode();

    node.Name = category.Name;
    // ... set node properties here ...

    // If the category has children, then continue down the tree
    // and create nodes for them.  This will continue recursively
    // to the bottom of the tree.
    // Note that I'm just guessing on the property names because
    // you didn't show us the code for what your entity actually
    // looks like.  This is why you should always show what code
    // you've attempted - you can get better, more precise answers
    // instead of complete guesses.
    if (category.Children != null)
    {
        foreach (var child in category.Children)
        {
            // For each child, recursively branch into them.
            node.Children.Add(CreateNode(child));
        }
    }

    return Node;
}

これは決してテストも研究もされていないことに注意してください。これは、ツリーのトラバーサルを示すためだけのものです。

于 2012-05-15T14:36:35.133 に答える