2014-05-22 80 views
1

我正在使用MvcSiteMapProvider 4.6.3,MVC 4.如何使用帶動態參數的Html.MvcSiteMap()。Menu()?

我想使用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 /首頁/產品1?的clientId = clientId2

SitemapTest /索引/客戶端1?productId參數=產品2

SitemapTest /索引/客戶端1?,STAFFID = staffId1

這些ID正在從數據庫中獲得。

有沒有辦法將參數傳遞給Html幫助來指定每個鏈接使用哪個ID?

回答

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; 
      } 
     } 
    } 
} 

而對於動態節點提供商,你需要在創建節點時,將被用作模板的定義節點,並在網站地圖,將實際上不存在。

// 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,的sessionId,等等),你可以強制網站地圖總是通過配置它們作爲preservedRouteParameters匹配。

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

您還可以通過強制匹配某些參數併爲其他參數的組合提供節點實例來組合這兩種技術。

要深入瞭解這些選項,請閱讀How to Make MvcSiteMapProvider Remember a User's Position