1

我有一个 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. 由于另一个原因被多次调用,尽管最高级别的动态节点提供程序只被调用一次。

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

这是一个示例提供程序:

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

任何帮助是极大的赞赏。

4

1 回答 1

0

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

于 2012-04-12T18:01:11.633 回答