Пользовательская навигация SharePoint 2 уровня
У меня есть простой сайт, состоящий из корневого сайта с 2 дочерними сайтами.
Теперь я хочу, чтобы навигация для всех 3 сайтов была одинаковой, и читайте:
Корневой сайт | Детский сайт 1 | Детский сайт 2
С выделенным в данный момент выбранным сайтом.
Я был в состоянии почти сделать это вручную, используя asp: repeater control и portalsitemapprovider. Проблема в том, что я могу получить только Root Site в навигации (установите ShowStartingNode в True) или только дочерние сайты, я не могу получить оба.
Я знаю, что вы можете получить и то и другое, если вы используете элемент sharepoint: aspmenu и установите для staticdisplaylevels значение 2, но мне не нравится грязный код, который выдает этот элемент управления. В основном я хочу подражать этому поведению управления, обернутому в мой собственный css. Есть идеи?
- Кроме того, есть ли у кого-нибудь идеи о том, как это можно сделать, поэтому, если у subsite1/2 есть последующие дочерние сайты / страницы, не имеет значения, сколько уровней в иерархии перемещается пользователем, все равно выделяется соответствующий дочерний сайт1 или subsite2? Мой текущий метод сравнивает currentnode с каждым из узлов провайдеров, чтобы определить, какие из них должны быть выделены, но это не работает, когда пользователь ушел с целевой страницы каждого дочернего сайта.
Спасибо!
1 ответ
Я думаю, что вы должны начать с корня и визуализировать этот узел в первом повторителе, а затем использовать дочерние узлы корня в качестве источника данных для второго повторителя, что-то вроде:
<asp:Repeater runat="server" ID="MenuRepeater"
DataSourceID="MainNavigationDataSource">
<HeaderTemplate>
// code here
</HeaderTemplate>
<ItemTemplate>
// code here
<asp:Repeater runat="server" ID="ChildMenuRepeater"
DataSource='<%# ((SiteMapNode)Container.DataItem).ChildNodes %>'>
<HeaderTemplate>
// code here
</HeaderTemplate>
<ItemTemplate>
// code here
</ItemTemplate>
</ItemTemplate>
Что касается вашего второго вопроса, я думаю (если я правильно понимаю), что вы можете использовать метод SiteMapNode.IsDescendantOf(), но я как-то напоминаю, что это не будет работать в SharePoint, поэтому я использовал этот вид кода, чтобы проверить, является ли узел "активный" узел:
string CurrentContextUrl = SPUtility.GetPageUrlPath(HttpContext.Current);
Uri CurrentUri = new Uri(CurrentContextUrl);
bool Active = CurrentUri.LocalPath.Equals(currentNode.Url);
Надеюсь, это поможет как-то:-)