使用MvcSiteMapProvider创建动态多级站点地图

时间:2012-04-12 14:36:22

标签: asp.net-mvc-3 mvcsitemapprovider

我有一个mvc.SiteMap定义如下:

<mvcSiteMap xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-3.0"
        xsi:schemaLocation="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-3.0    MvcSiteMapSchema.xsd"
        enableLocalization="true" >

<mvcSiteMapNode title="Home" controller="Home" action="Index" key ="_Home_">
    <mvcSiteMapNode title="View Plans" controller="Home" action="ViewCompletePlans"/>
        <mvcSiteMapNode title="Edit Plan" controller="Plan" action="EditPlan" dynamicNodeProvider= {pathToProvider}>
            <mvcSiteMapNode title="Critical Functions" controller="Plan" action="EditCriticalandNormalFunctions" dynamicNodeProvider={pathToProvider}>
                <mvcSiteMapNode title="Edit Critical Function" controller="CriticalFunction" action="EditCriticalFunction" dynamicNodeProvider= {pathToProvider}>
                    <mvcSiteMapNode title="Manage Uploaded Documents" controller="CriticalFunction" action="UploadedDocuments" dynamicNodeProvider={pathToProvider}></mvcSiteMapNode>
                </mvcSiteMapNode>
            </mvcSiteMapNode>
        </mvcSiteMapNode>
    </mvcSiteMapNode>
</mvcSiteMap>  

在每个级别,节点都是根据数据库中的值动态生成的。我的问题是,对于子节点,在构建站点地图时会多次调用节点提供程序。我不确定是不是:

  1. 为每个创建的父类型调用一次。因此,如果有5个计划,则关键函数的提供程序被调用5次,因此节点生成5次。如果是这样,有没有办法传递提供者信息,所以我只能生成与当前父节点关联的节点,而不是所有具有该类型的节点?或者有没有办法访问当前的父节点?
  2. 由于另一个原因被多次调用,尽管最高级别的动态节点提供程序只被调用一次。
  3. 代码现在正常运行,但效率非常低。

    以下是样本提供者:

    public class CriticalFunctionNodeProvider : DynamicNodeProviderBase  
    {  
          public override IEnumerable<DynamicNode> GetDynamicNodeCollection()  
        {
            var db = new COPEntities();
            var returnValue = new List<DynamicNode>();
            foreach (var criticalFunction in db.NormalFunctions)
            {
                var node = new DynamicNode();
                node.Title = "Critical Function: " + criticalFunction.FunctionName;
                node.ParentKey = "_Plan_" + criticalFunction.PlanId + "_CritFuncs_";
                node.RouteValues.Add("planId", criticalFunction.PlanId);
                node.RouteValues.Add("id", criticalFunction.Id);
                node.Key = "_Plan_" + criticalFunction.PlanId + "_CritFuncs_" + criticalFunction.Id;
                returnValue.Add(node);
            }
            return returnValue;
        }
    }  
    

    非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

目前除了在单个DynamicNodeProvider中创建层次结构外,无法执行此操作。 但这将是一个很好的补充。