1

我正在使用 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)

因此,如果我在索引页面上。菜单应该是

站点地图Test/Index/product1?clientId=clientId2

站点地图Test/Index/client1?productId=product2

SitemapTest/Index/client1?staffId=staffId1

这些 id 是从数据库中获取的。

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

4

1 回答 1

0

有2种方式,取决于路由值是直接用来标识页面的,还是一些环境值。

对于直接标识页面的值,您应该使用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 等),您可以通过将它们配置为 reservedRouteParameters 来强制 SiteMap 始终匹配它们。

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

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

要深入了解这些选项,请阅读如何使 MvcSiteMapProvider 记住用户的位置

于 2014-05-23T10:52:43.110 回答