Пользовательская навигация 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);

Надеюсь, это поможет как-то:-)

Другие вопросы по тегам