我正在使用MvcSiteMapProvider 4.6.3,MVC 4。
我想使用Html.MvcSiteMap()。Menu()生成菜单。
问题是URL中有多个参数,这些参数根据用户和文档ID进行更改。
我的站点地图如下所示:
<mvcSiteMapNode title="Home" controller="Home" action="Index">
<mvcSiteMapNode title="Site Map Test" controller="SitemapTest" action="Index" area="" key="sitemaptestnode">
<mvcSiteMapNode title="Sub1" controller="SitemapTest" action="Sub1" area="" />
<mvcSiteMapNode title="Sub2" controller="SitemapTest" action="Sub2" area="" />
</mvcSiteMapNode>
</mvcSiteMapNode>
这些动作需要不同的参数。
public ActionResult Index(string id, string clientId)
{
return View();
}
public ActionResult Sub1(string id, string productId)
{
return View();
}
public ActionResult Sub2(string id, string staffId)
{
return View();
}
我尝试使用HTML帮助程序来生成菜单。
@Html.MvcSiteMap().Menu(node, false, false)
因此,如果我在“索引”页面上。菜单应该是
SitemapTest / Index / product1?clientId = clientId2
SitemapTest / Index / client1?productId = product2
SitemapTest / Index / client1?staffId = staffId1
这些ID是从数据库获取的。
有没有一种方法可以将参数传递给HTML帮助,以指定用于每个链接的ID?
有两种方法,取决于路由值是直接用于识别页面还是环境值。
对于直接标识页面的值,应使用IDynamicNodeProvider或ISiteMapNodeProvider配置节点,以便在将新记录添加到数据库时它们可以构建新节点。
public class ProductDynamicNodeProvider
: DynamicNodeProviderBase
{
public override IEnumerable<DynamicNode> GetDynamicNodeCollection(ISiteMapNode node)
{
// TODO: Replace MyEntities with your entity framework context object
using (var db = new MyEntities())
{
// Create a node for each album
foreach (var album in db.Products)
{
DynamicNode dynamicNode = new DynamicNode();
dynamicNode.Title = product.Name;
dynamicNode.ParentKey = "Products"; // There must be a node in the SiteMap with key set to "Products" for this to work
dynamicNode.PreservedRouteParameters.Add("id"); // Force a match on this parameter always
dynamicNode.RouteValues.Add("productId", product.Id);
yield return dynamicNode;
}
}
}
}
对于动态节点提供程序,您需要一个定义节点,该定义节点将在创建节点时用作模板,并且实际上不会存在于SiteMap中。
// This node will be added to the SiteMap and serves as the parent node of each product
<mvcSiteMapNode title="All Products" controller="Products" action="Index" area="" key="Products">
// This node will become a template for each product node, but the node itself won't be added to the SiteMap
<mvcSiteMapNode controller="Products" action="Details" area="" dynamicNodeProvider="MyNamespace.ProductDynamicNodeProvider, MyAssemblyName" />
</mvcSiteMapNode>
对于环境值(用户ID,会话ID等),您可以通过将SiteMap配置为keepedRouteParameters来强制SiteMap始终匹配它们。
<mvcSiteMapNode title="Sub2" controller="SitemapTest" action="Sub2" area="" preservedRouteParameters="clientId,productId,staffId,id" />
您还可以通过在某些参数上强制匹配并为其他参数的组合提供节点实例来结合这两种技术。
要深入了解这些选项,请阅读如何使MvcSiteMapProvider记住用户的位置。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句