2013-10-09 123 views
2

我們想爲系統中的所有人添加動態節點。然而,我們希望使用屬性如何通過屬性將非動態節點添加到動態節點?

例如將屬性添加到動態節點。

[MvcSiteMapNode(Title = "Accidents", ParentKey = "PeopleDetails", Key = "Accidents", PreservedRouteParameters = "personId")] 

我們有大約40個節點,應該是每個人節點

如的孩子

People > Bob > Absences 
People > Bob > Holidays 
People > Bob > Training 

我們希望配置的操作方法e.g這些使用屬性添加一個網站地圖屬性上缺席索引操作。缺席索引以父節點的PersonId作爲其參數。

我們該如何做到這一點?我看到這個article說如何在XML中完成將非動態子項添加到動態節點。但是我看不到告訴站點地圖將基於屬性的節點添加到父動態節點的方法。我嘗試使用XML給它添加PeoplDetails的關鍵字,在siteamap的每個動態下添加一箇中間節點。然而它的關鍵似乎是交換爲Guid(我想讓動態節點的孩子獨特)

任何想法?我真的不想通過XML手動配置40個以上的子節點

回答

1

當使用MvcSiteMapNodeAttribute時,目前不可能向動態節點添加「靜態」節點。但是,您可以直接在IDynamicNodeProvider實現中添加「靜態」節點(即數據驅動節點的子節點)。

public class PeopleDynamicNodeProvider 
    : DynamicNodeProviderBase 
{ 
    public override IEnumerable<DynamicNode> GetDynamicNodeCollection(ISiteMapNode node) 
    { 
     using (var db = new MyContext()) 
     { 
      // Create a node for each album 
      foreach (var person in db.People) 
      { 
       string personKey = "Person_" + person.Id.ToString(); 

       DynamicNode dynamicNode = new DynamicNode(); 
       dynamicNode.Key = personKey; 
       dynamicNode.Title = person.Name; 
       dynamicNode.ParentKey = "People"; // Attach to a node that is defined somewhere else 
       dynamicNode.RouteValues.Add("id", person.Id.ToString()); 

       yield return dynamicNode; 

       DynamicNode staticNode = new DynamicNode(); 
       staticNode.Title = person.Name + " Details"; 
       staticNode.ParentKey = personKey; 
       staticNode.Controller = "People"; 
       staticNode.Action = "Details"; 
       staticNode.RouteValues.Add("id", person.Id.ToString()); 

       yield return staticNode; 
      } 
     } 
    } 
} 

如果你真的必須使用MvcSiteMapNodeAttribute定義它們,則可以劃分到上述2個獨立的動態節點提供者,然後聲明一個屬性的第二個。

由於多次調用數據庫會產生額外開銷,因此這會慢很多。您可以通過請求緩存您的人員數據來解決這個問題,以便在提供者之間共享。然後

public class PeopleDynamicNodeProvider 
    : DynamicNodeProviderBase 
{ 
    public override IEnumerable<DynamicNode> GetDynamicNodeCollection(ISiteMapNode node) 
    { 
     using (var db = new MyContext()) 
     { 
      // Create a node for each album 
      foreach (var person in db.People) 
      { 
       string personKey = "Person_" + person.Id.ToString(); 

       DynamicNode dynamicNode = new DynamicNode(); 
       dynamicNode.Key = personKey; 
       dynamicNode.Title = person.Name; 
       dynamicNode.ParentKey = "People"; // Attach to a node that is defined somewhere else 
       dynamicNode.RouteValues.Add("id", person.Id.ToString()); 

       yield return dynamicNode; 
      } 
     } 
    } 
} 

public class PeopleDetailsDynamicNodeProvider 
    : DynamicNodeProviderBase 
{ 
    public override IEnumerable<DynamicNode> GetDynamicNodeCollection(ISiteMapNode node) 
    { 
     using (var db = new MyContext()) 
     { 
      // Create a node for each album 
      foreach (var person in db.People.Where(x => x.PersonCategoryId == node.Key)) 
      { 
       string personKey = "Person_" + person.Id.ToString(); 

       DynamicNode staticNode = new DynamicNode(); 
       staticNode.Title = person.Name + " Details"; 
       staticNode.Key = person.PersonCategoryId; 
       staticNode.ParentKey = personKey; 
       staticNode.Controller = "People"; 
       staticNode.Action = "Details"; 
       staticNode.RouteValues.Add("id", person.Id.ToString()); 

       yield return staticNode; 
      } 
     } 
    } 
} 

和你的屬性定義會是這個樣子:

[MvcSiteMapNode(Title = "Placeholder Title (won't be seen)", Key = "Accidents", PreservedRouteParameters = "personId", DynamicNodeProvider = "MyNamespace.PeopleDetailsDynamicNodeProvider, MyAssembly")] 

有一個在你生產節點的數量有記錄的數量完全匹配的動態節點提供無約束數據庫 - 如果您需要根據您的要求創建更多節點。

注意:您可能需要根據數據的實際組織方式調整鍵/父鍵映射。

+0

神奇的將會給它一個去。我想也許我們的網站在結構上相當複雜。人們至少有40個子節點,其中大多數都有創建,編輯和添加自己的節點。我們也有資產有許多子節點和50左右的管理實體,可以每個編輯等。什麼是太多的節點3000人* 40個子節點* 4個子節點聽起來對我來說很多? – GraemeMiller

+0

對於CRUD操作,通常可以避免使用preservedRouteParameters來強制操作匹配一組固定的節點,因爲將這些操作添加到菜單並不常見(您首先會從菜單導航到人員列表頁面,然後單擊該頁面上特定記錄上的「編輯」,「詳細信息」或「刪除」)。有關演示,請參閱此帖子上的代碼下載:http://www.shiningtreasures。COM /後/ 2013/09/02 /如何對化妝mvcsitemapprovider記住,一個用戶位置 – NightOwl888