MvcSiteMapProvider未在动态节点中生成正确的URL

时间:2014-07-29 20:08:25

标签: c# asp.net-mvc routes mvcsitemapprovider

我编写了一个动态节点提供程序,如下所示:

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上判断我,它不在我的手中:-))

1 个答案:

答案 0 :(得分:1)

问题是您没有将“实体”添加到节点的RouteValues集合中,而是将其添加到Attributes中,使其成为自定义属性值。生成URL时不考虑自定义属性。

如果你改变:

newNode.Attributes.Add("entity",di.DictionaryName);

要:

newNode.RouteValues.Add("entity",di.DictionaryName);

然后将实体参数插入到URL中。