2

システム内のすべての人に動的ノードを追加したいと考えています。ただし、属性を使用して多くの子ノードを動的ノードにアタッチしたい

例えば

[MvcSiteMapNode(Title = "Accidents", ParentKey = "PeopleDetails", Key = "Accidents", PreservedRouteParameters = "personId")]

各人物ノードの子になるノードは約 40 個あります。

例えば

People > Bob > Absences 
People > Bob > Holidays 
People > Bob > Training

アクション メソッドの属性を使用してこれらを構成したいと考えています。たとえば、不在インデックス アクションにサイト マップ属性を追加します。Absences Index は、親ノードの PersonId をパラメーターとして受け取ります。

どうすればこれを達成できますか? この記事には、XML でそれを行う方法が記載されています動的でない子を動的ノードに追加します。ただし、属性ベースのノードを親動的ノードに追加するようにサイトマップに指示する方法がわかりません。XML を使用してサイトマップの各ダイナミックの下に中間ノードを追加して、PeoplDetails のキーを指定してみました。ただし、そのキーは Guid に交換されているようです (動的ノードの子を一意にするためだと思います)。

何か案は?XML を介して 40 以上の子ノードを手動で構成する必要はありません。

4

1 に答える 1

1

現在、MvcSiteMapNodeAttribute を使用している場合、「静的」ノードを動的ノードに追加することはできません。ただし、「静的」ノード (つまり、データ駆動型ノードの子) を IDynamicNodeProvider 実装内に直接追加できます。

public class PeopleDynamicNodeProvider 
    : DynamicNodeProviderBase 
{ 
    public override IEnumerable<DynamicNode> GetDynamicNodeCollection(ISiteMapNode node) 
    {
        using (var db = new MyContext())
        {
            // Create a node for each album 
            foreach (var person in db.People) 
            { 
                string personKey = "Person_" + person.Id.ToString();

                DynamicNode dynamicNode = new DynamicNode();
                dynamicNode.Key = personKey;
                dynamicNode.Title = person.Name;
                dynamicNode.ParentKey = "People"; // Attach to a node that is defined somewhere else
                dynamicNode.RouteValues.Add("id", person.Id.ToString());

                yield return dynamicNode;

                DynamicNode staticNode = new DynamicNode(); 
                staticNode.Title = person.Name + " Details"; 
                staticNode.ParentKey = personKey;
                staticNode.Controller = "People";
                staticNode.Action = "Details";
                staticNode.RouteValues.Add("id", person.Id.ToString());

                yield return staticNode;
            }
        }
    } 
}

本当に MvcSiteMapNodeAttribute を使用してそれらを定義する必要がある場合は、上記を 2 つの別個の動的ノード プロバイダーに分割し、2 つ目のプロバイダーを属性で宣言できます。

これは、データベースへの複数の呼び出しによるオーバーヘッドが追加されるため、かなり遅くなります。プロバイダー間で共有されるように、人のデータをキャッシュするように要求することで、潜在的に修正できます。

public class PeopleDynamicNodeProvider 
    : DynamicNodeProviderBase 
{ 
    public override IEnumerable<DynamicNode> GetDynamicNodeCollection(ISiteMapNode node) 
    {
        using (var db = new MyContext())
        {
            // Create a node for each album 
            foreach (var person in db.People) 
            { 
                string personKey = "Person_" + person.Id.ToString();

                DynamicNode dynamicNode = new DynamicNode();
                dynamicNode.Key = personKey;
                dynamicNode.Title = person.Name;
                dynamicNode.ParentKey = "People"; // Attach to a node that is defined somewhere else
                dynamicNode.RouteValues.Add("id", person.Id.ToString());

                yield return dynamicNode;
            }
        }
    } 
}

public class PeopleDetailsDynamicNodeProvider 
    : DynamicNodeProviderBase 
{ 
    public override IEnumerable<DynamicNode> GetDynamicNodeCollection(ISiteMapNode node) 
    {
        using (var db = new MyContext())
        {
            // Create a node for each album 
            foreach (var person in db.People.Where(x => x.PersonCategoryId == node.Key)) 
            { 
                string personKey = "Person_" + person.Id.ToString();

                DynamicNode staticNode = new DynamicNode(); 
                staticNode.Title = person.Name + " Details";
                staticNode.Key = person.PersonCategoryId;
                staticNode.ParentKey = personKey;
                staticNode.Controller = "People";
                staticNode.Action = "Details";
                staticNode.RouteValues.Add("id", person.Id.ToString());

                yield return staticNode;
            }
        }
    } 
}

属性定義は次のようになります。

[MvcSiteMapNode(Title = "Placeholder Title (won't be seen)", Key = "Accidents", PreservedRouteParameters = "personId", DynamicNodeProvider = "MyNamespace.PeopleDetailsDynamicNodeProvider, MyAssembly")]

動的ノード プロバイダーには、生成するノードの数がデータベース内のレコードの数と正確に一致する必要があるという制約はありません。要件に応じて、必要に応じてさらにノードを作成できます。

注: データが実際にどのように構成されているかに応じて、キー/親キーのマッピングを調整する必要がある場合があります。

于 2013-10-10T13:37:04.297 に答える