首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何通过属性将非动态节点添加到动态节点?

如何通过属性将非动态节点添加到动态节点?
EN

Stack Overflow用户
提问于 2013-10-09 23:23:55
回答 1查看 1.3K关注 0票数 2

我们希望为系统中的所有人添加动态节点。但是,我们希望使用属性将许多子节点附加到动态节点上。

例如:

代码语言:javascript
运行
复制
[MvcSiteMapNode(Title = "Accidents", ParentKey = "PeopleDetails", Key = "Accidents", PreservedRouteParameters = "personId")]

我们有大约40个节点,它们应该是每个人节点的一个子节点。

例如。

代码语言:javascript
运行
复制
People > Bob > Absences 
People > Bob > Holidays 
People > Bob > Training

我们希望使用Action方法上的属性来配置这些属性,例如在缺席索引操作上添加一个Site属性。缺勤索引以父节点的PersonId作为其参数。

我们如何才能做到这一点?我看到这个文章说明了如何在XML中将非动态子节点添加到动态节点中。但是,我看不到告诉sitemap向父动态节点添加基于属性的节点的方法。我尝试使用XML在站点a中的每个动态下添加一个中间节点,给它一个PeoplDetails键。但是,它的键似乎被替换为Guid (我猜是为了使动态节点子节点唯一)。

有什么想法吗?我真的不想通过XML手动配置40+子节点

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-10 13:37:04

目前不可能在使用MvcSiteMapNodeAttribute时向动态节点添加“静态”节点。但是,您可以直接在IDynamicNodeProvider实现中添加“静态”节点(即数据驱动节点的子节点)。

代码语言:javascript
运行
复制
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定义它们,则可以将上面的内容划分为两个单独的动态节点提供程序,然后在属性上声明第二个。

由于对数据库的多个调用的额外开销,这会慢一些。您可以通过请求缓存人员数据来修复这个问题,以便在提供者之间共享这些数据。

代码语言:javascript
运行
复制
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;
            }
        }
    } 
}

然后属性定义如下所示:

代码语言:javascript
运行
复制
[MvcSiteMapNode(Title = "Placeholder Title (won't be seen)", Key = "Accidents", PreservedRouteParameters = "personId", DynamicNodeProvider = "MyNamespace.PeopleDetailsDynamicNodeProvider, MyAssembly")]

在动态节点提供程序中没有限制,您生成的节点数量必须与数据库中的记录数完全匹配--如果需要根据您的需求创建更多的节点,则可以创建更多的节点。

注意:您可能需要根据数据的实际组织方式调整键/父键映射。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19284507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档