Превью для веб-части в SharePoint 2010/2013
В SharePoint в каждой коллекции сайтов есть библиотека "Коллекция веб-частей" (Web Part Gallery), в которой хранятся файлы, описывающие веб-части. Ссылка на эту библиотеку имеет следующий вид: http://sitecollection/_catalogs/wp
.
Каждую веб-часть из этой библиотеки можно просмотреть на странице просмотра веб-частей (/_layouts/WPPrevw.aspx
). В этом посте я расскажу о том как подготовить свою веб-часть к тому, чтобы она отображалась адекватно.
Страница предварительного просмотра
Сначала посмотрим страницу, предназначенную для предварительного просмотра (WPPrevw.aspx). Унаследована она от класса Microsoft.SharePoint.WebControls.LayoutsPageBase, т.е. ничего особенного в code-behind не имеет. Сама страница выглядит вот так (код частично):
<table cellpadding="0px" cellspacing="0px" border="0" width="100%" height="100%">
<tr valign="top">
<td style="color: black; font-family: verdana; font-size: 10pt; font-weight: bold;">
<%
if (WebPartPreview.WebPart != null)
{
SPHttpUtility.HtmlEncode(WebPartPreview.WebPart.Title,Response.Output);
}
%>
</td>
</tr>
<tr valign="top">
<td class="ms-descriptiontext">
<%
if (WebPartPreview.WebPart != null)
{
SPHttpUtility.HtmlEncodeAllowSimpleTextFormatting(
WebPartPreview.WebPart.Description,Response.Output);
}
%>
</td>
</tr>
</table>
<table align="center" cellpadding="0px" cellspacing="30px" border="0">
<tr>
<td>
<WebPartPages:WebPartPreview id="WebPartPreview" runat="server"/>
</td>
</tr>
</table>
В верхней части отображаются название (Title) и описание (Description) веб-части. Ниже расположен контрол WebPartPreview, который и отвечает за отображение веб-части на странице просмотра.
WebPartPreview
Теперь посмотрим сам контрол WebPartPreview. Он так же прост до неприличия (члена класса без реализации):
[PermissionSet(SecurityAction.LinkDemand, Name="FullTrust")]
public sealed class WebPartPreview : Control
{
// Fields
private string m_importErrorMessage;
private string m_rootWebUrl;
private WebPart m_webPart;
// Methods
public WebPartPreview();
[SharePointPermission(SecurityAction.Demand, ObjectModel=true)]
protected override void CreateChildControls();
[SharePointPermission(SecurityAction.Demand, ObjectModel=true)]
protected override void Render(HtmlTextWriter writer);
// Properties
public WebPart WebPart { get; }
}
Веб-часть этот контрол получает из библиотеки веб-частей по идентификатору элемента. В 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, значит веб-часть находится в режиме предварительного просмотра, иначе в рабочем состоянии. Следующее свойство, добавленное в веб-часть, поможет это выяснить:
///<summary>
///Возвращает флаг, указывающий загружена ли
///веб-часть для предварительного просмотра
///</summary>
private bool IsPreview
{
get
{
// Если родительского контрола нет, то возвращаем False
if (Parent == null) return false;
// Получаем тип родительского контрола
var parentType = Parent.GetType().FullName;
// Проверяем загружена ли веб-часть в контейнер типа WebPartPreview
return parentType == "Microsoft.SharePoint.WebPartPages.WebPartPreview";
}
}
Если ваша веб-часть не работает на странице предварительного просмотра веб-частей, то можно использовать это свойство для реализации различных "заглушек" или простого отображения картинки (как в случае с редактором содержимого).
Этот подход реализован в моем фильтре для списков SharePoint.