2014-05-22 2 views
1

MvcSiteMapProvider 4.6.3, MVC 4를 사용하고 있습니다.Html.MvcSiteMap() 사용 방법 동적 매개 변수가있는 Menu()?

메뉴를 생성하려면 Menu()를 사용하고 싶습니다.

사용자 및 문서 ID를 기반으로 변경되는 URL에 여러 매개 변수가 있습니다. 이러한 조치는 다른 매개 변수를 필요

<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/색인/CLIENT1? productId에 = 제품 2

SitemapTest/색인/CLIENT1? staffId = staffId1

이러한 ID해야한다 데이터베이스에서 가져 오는 중입니다.

각 링크에 사용할 ID를 지정하기 위해 매개 변수를 HTML 도움말에 전달할 수 있습니까?

답변

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> 

주변 값 (userId를, sessionId가 등)의 경우, 당신은 항상 preservedRouteParameters로를 구성하여 그들과 일치하도록 사이트 맵을 강제 할 수 있습니다.

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

특정 매개 변수와 일치 시키거나 다른 매개 변수를 조합하여 노드 인스턴스를 제공함으로써 두 가지 기술을 결합 할 수도 있습니다.

이 옵션에 대해 자세히 알아 보려면 How to Make MvcSiteMapProvider Remember a User's Position을 읽어보십시오.

관련 문제