Вам, вероятно, понадобятся три вещи:
- Структура иерархии в вашей базе данных *
- Пользовательский поставщик SiteMap на основе StaticSiteMapProvider для чтения иерархии
- A SiteMapPath элемент управления для отображения Breadcrumb.
* Я немного поэкспериментировал, когда хотел что-то похожее для клиентского сайта, и решил, что хранить структуру пути в базе данных будет проще всего - я дал здесь ответ , ранее карта сайта произвольной глубины - обратите внимание, что если вы используете SQL2008, вы можете использовать новый тип данных HierarchyId , чтобы сделать это немного проще.
При этом, если у вас есть такие вещи, как категории и продукты, вы, вероятно, можете использовать более простую систему в своей базе данных.
Ключевые функции, которые мне нужно было создать, чтобы решить эту проблему, были такими:
/// <summary>
/// Gets this SiteMaps children.
/// </summary>
/// <value>The children.</value>
public List<SiteMap> Children {
get {
if (null == m_Children && !m_AttemptedToLoadChildren) {
m_AttemptedToLoadChildren = true;
m_Children = ctx.GetSiteMapChildrenByPath(_Path, 1).ToList();
// Sorts ascending.
m_Children.Sort(( sm1, sm2 ) => sm1.SortOrder.CompareTo(sm2.SortOrder));
// CMS Sorts Descending, so reverse the list.
m_Children.Reverse();
}
return m_Children;
}
}
/// <summary>
/// Gets a value indicating whether this instance has any children.
/// </summary>
/// <value>
/// <c>true</c> if this instance has children; otherwise, <c>false</c>.
/// </value>
public bool HasChildren {
get {
if (null != Children && Children.Any()) {
m_HasChildren = true;
}
return m_HasChildren;
}
}
/// <summary>
/// Gets this SiteMaps parent.
/// </summary>
/// <value>The parent.</value>
public SiteMap Parent {
get {
if (null == m_Parent && null != _ParentId) {
m_Parent = ctx.GetSiteMap(_ParentId);
}
return m_Parent;
}
}
GetSiteMap
и GetSiteMapChildrenByPath
обращаются к хранимым процессам для построения иерархии, поскольку вытащить ее с помощью LINQ будет довольно сложно.