MvcSiteMap:未到达动态节点提供程序

时间:2012-11-15 14:27:07

标签: asp.net-mvc mvcsitemapprovider asp.net-mvc-sitemap

我创建了一个项目,使用属性定义节点,我在 web.config 中设置它来扫描属性,它工作正常。
我根本不使用XML文件。

现在我想添加动态节点提供程序,我该怎么做? 有没有办法在没有XML( .sitemap )文件的情况下做到这一点? 我需要确保它位于根目录下,使用MvcSiteMapNodeAttribute属性在代码中设置。

我已阅读documentation而我无法确定将这一行放在哪里:

<mvcSiteMapNode
  title="Details" action="Details"              
  dynamicNodeProvider="Project.StoreDetailsDynamicNodeProvider, Prject" />

它应该指向什么行动?另外如上所述,root元素是使用属性定义的,所以我的问题是是否有一种方法可以避免使用XML,或者说,有效的方式来声明XML(越少越好)包含我的动态提供者。

更新

我尝试过以下操作,但仍未找到节点提供程序( From HomeController.cs )。

[MvcSiteMapNode(Title = "Home", Key = HomeMenuKey,
  DynamicNodeProvider = "Project.Namespace.NodeProvider, Assembly")]
public ActionResult Index()
{
  return View();
}

2 个答案:

答案 0 :(得分:1)

你能在控制器方法属性中定义它(根本不使用XML)吗?

例如:

[MvcSiteMapNode(Title="Details", 
  DynamicNodeProvider = "Project.StoreDetailsDynamicNodeProvider, Project")]
public ActionResult Index()
{
    return View();
}

答案 1 :(得分:1)

  1. 似乎在根节点中忽略dynamicNodeProvider属性,也就是在属性中定义它时。 因此,在根目录下添加动态节点提供程序的唯一方法是通过在虚拟操作等上指定它或使用XML。
  2. 一个有趣的说明:在XML和属性中定义的实际区别在于,如果它在属性中定义,它(即gen。菜单项)将在菜单中排在最后,而在XML中定义时,它将在根项目(我猜这将是Home),请注意,这仍然可以通过属性中的Order属性进行控制。
  3. 在我的Web.Config中,我将siteMapFile留空,依赖于它在wiki页面中的说法,默认值为~/Web.sitemap,实际上这是假的(我已经在更新的wiki)中更正过了 我不认为这种行为应该是这样的,我认为MvcSiteMap引擎应该扫描动态节点提供程序,就像它扫描动态节点属性一样(我在网站上发布了here is the issue)。