为MVC.Sitemap中的节点动态创建子节点

时间:2014-04-11 09:12:25

标签: node.js asp.net-mvc-4 mvcsitemapprovider

我正在开发一个MVC 4应用程序,我正在使用Mvc.sitemap在masterpage上显示一个菜单。我有一个名为“任务”的节点,它会在菜单上的其他节点中出现。我需要根据从数据库中获取的值为该节点创建子节点。根据值的数量,将创建子节点,并在单击每个子代码时执行某个功能。

由于我不知道如何根据数据库中的值生成子节点,因此我在Mvc.sitemap中拥有硬编码节点。以下是我现在一直在做的代码:

<?xml version="1.0" encoding="utf-8" ?>
<mvcSiteMap xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-4.0"
            xsi:schemaLocation="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-4.0 MvcSiteMapSchema.xsd">

  <mvcSiteMapNode title="Home" controller="Home" action="Index">
  <mvcSiteMapNode title="Tasks" controller="Home" action="Index">
    <mvcSiteMapNode title="Task 1" controller="Home" action="Index" url="http://localhost:...."/>
    <mvcSiteMapNode title="Task 2" controller="Home" action="Index" url="http://localhost:...."/>
  </mvcSiteMapNode>  
    <mvcSiteMapNode title="Admin" controller="Home" action="Admin"/>
    <mvcSiteMapNode title="About" controller="Home" action="About"/>
    <mvcSiteMapNode title="Help" controller="Home" action="Help"/>
  </mvcSiteMapNode>
</mvcSiteMap>

正如您在上面的代码中看到的,我已经硬编码了子节点并且还指定了url属性。

请帮助您了解如何动态实现此目的。在此先感谢!!

1 个答案:

答案 0 :(得分:1)

这是dynamic node providers的用途。

<mvcSiteMapNode title="Tasks" controller="Home" action="Index" key="TasksIndex">
    <!-- This is the task template node - this node won't be added to the SiteMap, 
    but will be used to define the defaults of the Dynamic Nodes -->
    <mvcSiteMapNode action="Index" dynamicNodeProvider="MyNamespace.TaskDynamicNodeProvider, MyAssembly" />
</mvcSiteMapNode>


namespace MyNamespace
{
    public class TaskDynamicNodeProvider 
        : DynamicNodeProviderBase 
    { 
        public override IEnumerable<DynamicNode> GetDynamicNodeCollection(ISiteMapNode node) 
        {
            using (var db = new MyEntities())
            {
                // Create a node for each album 
                foreach (var task in db.Tasks) 
                { 
                    var dynamicNode = new DynamicNode(); 
                    dynamicNode.Title = task.Name; 
                    dynamicNode.ParentKey = "TasksIndex"; 
                    dynamicNode.RouteValues.Add("id", task.Id);

                    // NOTE: Controller is automatically inherited in the XML from the 
                    // nearest parent node where it is set, and action is set in the 
                    // template node in this example. However, you can override the
                    // values here if you need to.

                    // dynamicNode.Controller = "Home";
                    // dynamicNode.Action = "Index";

                    yield return dynamicNode;
                }
            }
        } 
    }
}