2012-04-12 43 views
0

一个动态多级站点地图我有定义是这样的一个mvc.SiteMap:创建使用MvcSiteMapProvider

<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. 由于其他原因被多次调用,尽管最高级动态节点提供程序仅被调用一次。

该代码现在工作,但效率非常低。

这里是一个样本提供者:

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; 
    } 
} 

任何帮助是极大的赞赏。

回答

0

目前没有办法做到这一点,除了使单个DynamicNodeProvider中的层次结构。 但它会是一个很好的补充。