Пропадающий контрол выбора представления списка

23 января 2012 г.

В SharePoint 2010 при просмотре содержимого списка есть одна очень спорная особенность: если на странице расположены более одной веб-части, то контрол этот уходит по-английски. В этом посте я расскажу почему это происходит и как я решаю эту проблему.

ListTitleViewSelectorMenu

Сам контрол называется ListTitleViewSelectorMenu и расположен он на странице [SharePoint Root]\TEMPLATE\Pages\viewpage.aspx. Открываем сборку Microsoft.SharePoint.dll в рефлекторе и видим переопределенное свойство Visible:

  1. public override bool Visible
  2. {
  3.   [SharePointPermission(SecurityAction.Demand, ObjectModel=true)]
  4.   get
  5.   {
  6.     if (!this.SingleWebPartPresentOnPage)
  7.     {
  8.       return false;
  9.     }
  10.     return base.Visible;
  11.   }
  12. }

Причина такого поведения ясна: если на странице лежат два контрола, отображающих содержимое из различных списков, то понять представления какого из них отображать пользователю невозможно. Но этот сценарий маловероятен (ведь речь идет о странице просмотра элементов конкретного списка). У меня на проекте был случай более приближенный к реальности: поверх списка располагалась веб-часть, предназначенная для фильтрации данных. И фильтровать данные, отталикаваясь только от представления по умолчанию пользователи не хотели.

Свой контрол

Пришлось писать свой контрол и заменять им стандартный на странице viewpage.aspx. Сам класс ListTitleViewSelectorMenu оказался запечатанным пришлось наследоваться от класса ViewSelectorMenu и дублировать функционал стандартного контрола.

Проблема оказалась в свойстве PageInDesignMode

  1. private bool PageInDesignMode
  2. {
  3.   get
  4.   {
  5.     if (this.m_wpManager == null)
  6.     {
  7.       this.m_wpManager = WebPartManager.GetCurrentWebPartManager(this.Page) as SPWebPartManager;
  8.     }
  9.     if (!this.m_wpDesignInit && (this.m_wpManager != null))
  10.     {
  11.       this.m_wpDesignInit = true;
  12.       this.m_wpDesign = this.m_wpManager.InDesignMode;
  13.     }
  14.     return this.m_wpDesign;
  15.   }
  16. }
Оно обращается к внутреннему свойству SPWebPartManager.InDesignMode. Каюсь: я просто закоментировал эту строку за неимением времени разбираться подробнее.

Поделиться

Комментарии