Превью для веб-части в SharePoint 2010/2013

В SharePoint в каждой коллекции сайтов есть библиотека "Коллекция веб-частей" (Web Part Gallery), в которой хранятся файлы, описывающие веб-части. Ссылка на эту библиотеку имеет следующий вид: http://sitecollection/_catalogs/wp.

Каждую веб-часть из этой библиотеки можно просмотреть на странице просмотра веб-частей (/_layouts/WPPrevw.aspx). В этом посте я расскажу о том как подготовить свою веб-часть к тому, чтобы она отображалась адекватно.

WebPart Preview. SharePoint 2010

Страница предварительного просмотра

Сначала посмотрим страницу, предназначенную для предварительного просмотра (WPPrevw.aspx). Унаследована она от класса Microsoft.SharePoint.WebControls.LayoutsPageBase, т.е. ничего особенного в code-behind не имеет. Сама страница выглядит вот так (код частично):

  1. <table cellpadding="0px" cellspacing="0px" border="0" width="100%" height="100%">
  2.     <tr valign="top">
  3.         <td style="color: black; font-family: verdana; font-size: 10pt; font-weight: bold;">
  4.             <% 
  5.             if (WebPartPreview.WebPart != null)
  6.             {
  7.                 SPHttpUtility.HtmlEncode(WebPartPreview.WebPart.Title,Response.Output);
  8.             } 
  9.             %>
  10.         </td>
  11.     </tr>
  12.     <tr valign="top">
  13.         <td class="ms-descriptiontext">
  14.             <%
  15.             if (WebPartPreview.WebPart != null)
  16.             {
  17.                 SPHttpUtility.HtmlEncodeAllowSimpleTextFormatting(
  18.                     WebPartPreview.WebPart.Description,Response.Output);
  19.             } 
  20.             %>
  21.         </td>
  22.     </tr>
  23. </table>
  24. <table align="center" cellpadding="0px" cellspacing="30px" border="0">
  25.     <tr>
  26.         <td>
  27.             <WebPartPages:WebPartPreview id="WebPartPreview" runat="server"/>
  28.         </td>
  29.     </tr>
  30. </table>

В верхней части отображаются название (Title) и описание (Description) веб-части. Ниже расположен контрол WebPartPreview, который и отвечает за отображение веб-части на странице просмотра.

WebPartPreview

Теперь посмотрим сам контрол WebPartPreview. Он так же прост до неприличия (члена класса без реализации):

  1. [PermissionSet(SecurityAction.LinkDemand, Name="FullTrust")]
  2. public sealed class WebPartPreview : Control
  3. {
  4.     // Fields
  5.     private string m_importErrorMessage;
  6.     private string m_rootWebUrl;
  7.     private WebPart m_webPart;
  8.  
  9.     // Methods
  10.     public WebPartPreview();
  11.     [SharePointPermission(SecurityAction.Demand, ObjectModel=true)]
  12.     protected override void CreateChildControls();
  13.     [SharePointPermission(SecurityAction.Demand, ObjectModel=true)]
  14.     protected override void Render(HtmlTextWriter writer);
  15.  
  16.     // Properties
  17.     public WebPart WebPart { get; }
  18. }

Веб-часть этот контрол получает из библиотеки веб-частей по идентификатору элемента. В SharePoint 2010 и SharePoint 2013 элемент из этой библиотеки с ID равным 1 - это веб-часть "Редактор содержимого". Т.е. на странице по адресу вида http://sitecollection/_layouts/WPPrevw.aspx?ID=1 (или http://sitecollection/_layouts/15/WPPrevw.aspx?ID=1 для SharePoint 2013) будет отображена именно эта веб-часть.

Как в SharePoint реализован предварительный просмотр веб-частей понятно. Теперь перейдем к веб-части.

Веб-часть и предварительный просмотр

Чтобы понять находится веб-часть в рабочем состоянии или пользователь хочет просто посмотреть как она выглядит и что из себя представляет, достаточно проверить тип родительского контрола. Если это Microsoft.SharePoint.WebPartPages.WebPartPreview, значит веб-часть находится в режиме предварительного просмотра, иначе в рабочем состоянии. Следующее свойство, добавленное в веб-часть, поможет это выяснить:

  1. ///<summary>
  2. ///Возвращает флаг, указывающий загружена ли 
  3. ///веб-часть для предварительного просмотра
  4. ///</summary>
  5. private bool IsPreview
  6. {
  7.     get
  8.     {
  9.         // Если родительского контрола нет, то возвращаем False
  10.         if (Parent == nullreturn false;
  11.         // Получаем тип родительского контрола
  12.         var parentType = Parent.GetType().FullName;
  13.         // Проверяем загружена ли веб-часть в контейнер типа WebPartPreview
  14.         return parentType == "Microsoft.SharePoint.WebPartPages.WebPartPreview";
  15.     }
  16. }

Если ваша веб-часть не работает на странице предварительного просмотра веб-частей, то можно использовать это свойство для реализации различных "заглушек" или простого отображения картинки (как в случае с редактором содержимого).

Этот подход реализован в моем фильтре для списков SharePoint в файле SPListViewFilter.cs.


Поделиться

Коментарии