當使用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")]
有一個在你生產節點的數量有記錄的數量完全匹配的動態節點提供無約束數據庫 - 如果您需要根據您的要求創建更多節點。
注意:您可能需要根據數據的實際組織方式調整鍵/父鍵映射。
神奇的將會給它一個去。我想也許我們的網站在結構上相當複雜。人們至少有40個子節點,其中大多數都有創建,編輯和添加自己的節點。我們也有資產有許多子節點和50左右的管理實體,可以每個編輯等。什麼是太多的節點3000人* 40個子節點* 4個子節點聽起來對我來說很多? – GraemeMiller
對於CRUD操作,通常可以避免使用preservedRouteParameters來強制操作匹配一組固定的節點,因爲將這些操作添加到菜單並不常見(您首先會從菜單導航到人員列表頁面,然後單擊該頁面上特定記錄上的「編輯」,「詳細信息」或「刪除」)。有關演示,請參閱此帖子上的代碼下載:http://www.shiningtreasures。COM /後/ 2013/09/02 /如何對化妝mvcsitemapprovider記住,一個用戶位置 – NightOwl888