Превью для веб-части в 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.

Теги

Поделиться

Виталий Жуков

Виталий Жуков

Техлид, Архитектор, Разработчик, Microsoft MVP. Более 20 лет опыта в области системной интеграции и разработки программного обеспечения. Специализируюсь на проектировании и внедрении масштабируемых высокопроизводительных программных решений в различных отраслях.