我编写了一个动态节点提供程序,如下所示:
public override IEnumerable<DynamicNode> GetDynamicNodeCollection(ISiteMapNode node)
{
var dictionaryDefs = from d in provider.GetDictionaries()
orderby d.DisplayNamePlural
select d;
foreach (DictionaryInfo di in dictionaryDefs)
{
var newNode = new DynamicNode()
{
Title = di.DisplayNamePlural,
Description = "Import " + di.DisplayNamePlural,
ParentKey = "Import Records"
};
newNode.Attributes.Add("entity",di.DictionaryName);
yield return newNode;
}
}
我的模板节点看起来像(匿名的命名空间和程序集名称):
<mvcSiteMapNode title ="ToBeReplaced" route="CMS_EntityAction" controller="ImportDictionary" action="Import" crudlevel="Update" dynamicNodeProvider="NameSpace.INeedToImportDataNodeProvider, MyAssembly"/>
这是我指定使用的路线:
routes.MapRoute(
"CMS_EntityAction", // Route name
"{controller}/{action}/{entity}",
new { action = "Index", controller = "Grid", showCheckboxes = UrlParameter.Optional },
new { controller = @"(Grid|ImportDictionary)" }
);
请注意,动态节点提供程序提供entity
值,但控制器和操作将从模板继承。
我为Urls获得的只是#34;#&#34;,从我在浏览源代码中可以看出,这意味着UrlResolver无法解析Url。
如果我从模板节点(route="CMS_EntityAction"
)中删除特定的路由名称,那么它只会为/ImportDictionary/Import
缺少entity
的每个节点反复生成相同的URL。 } value作为第3段。
我尝试在动态节点提供程序中指定控制器和操作而不是模板,我得到同样的东西,它只是不会在创建URL时使用entity
的值。
我需要更改,指定或修复的任何想法?感谢。
(请不要在ShowCheckboxes上判断我,它不在我的手中:-))
答案 0 :(得分:1)
问题是您没有将“实体”添加到节点的RouteValues集合中,而是将其添加到Attributes中,使其成为自定义属性值。生成URL时不考虑自定义属性。
如果你改变:
newNode.Attributes.Add("entity",di.DictionaryName);
要:
newNode.RouteValues.Add("entity",di.DictionaryName);
然后将实体参数插入到URL中。