我正在开发一个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属性。
请帮助您了解如何动态实现此目的。在此先感谢!!
答案 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;
}
}
}
}
}