如何使用Html.MvcSiteMap()。菜单()与动态参数?

时间:2014-05-22 21:24:59

标签: mvcsitemapprovider asp.net-mvc-sitemap

我使用的是MvcSiteMapProvider 4.6.3,MVC 4。

我想使用Html.MvcSiteMap()。Menu()来生成菜单。

问题是我在URL中有多个参数,这些参数会根据用户和文档ID进行更改。

我的Sitemap如下:

<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 /索引/产品1?的clientId = clientId2

SitemapTest /索引/客户端1?的productId =产品2

SitemapTest /索引/客户端1?= STAFFID staffId1

这些ID来自数据库。

有没有办法将参数传递给Html帮助,以指定每个链接使用哪个Id?

1 个答案:

答案 0 :(得分:0)

有两种方式,它取决于路线值是直接用于识别页面,还是某些环境值。

对于直接标识页面的值,您应该使用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>

对于环境值(userId,sessionId等),您可以通过将它们配置为savedRouteParameters来强制SiteMap始终匹配它们。

<mvcSiteMapNode title="Sub2" controller="SitemapTest" action="Sub2" area="" preservedRouteParameters="clientId,productId,staffId,id" />

您还可以通过强制匹配某些参数并为其他参数的组合提供节点实例来组合这两种技术。

要深入了解这些选项,请阅读How to Make MvcSiteMapProvider Remember a User's Position