Sharepoint: как найти все страницы, на которых размещена определенная веб-часть? - PullRequest
5 голосов
/ 11 марта 2009

Как следует из вопроса - есть ли способ определить, какие страницы включают мою веб-часть?

Ответы [ 2 ]

15 голосов
/ 11 марта 2009

Если вы ищете код, у меня есть кое-что для вас. Если вы хотите найти все веб-части Content Query, вы бы назвали мой код следующим образом:

FindWebPart("http://server.com/", "Microsoft.SharePoint.Publishing.WebControls.ContentByQueryWebPart");

Вот код:

public static void FindWebPart(string siteCollectionUrl, string webPartName)
{
    using (SPSite siteCollection = new SPSite(siteCollectionUrl))
    {
        using (SPWeb rootSite = siteCollection.OpenWeb())
        {
            FindWebPartHelper(rootSite, webPartName);
        }
    }
}

public static void FindWebPartHelper(SPWeb site, string webPartName)
{
    // Search for web part in Pages document library
    SPList pagesList = null;
    try
    {
        pagesList = site.Lists["Pages"];
    }
    catch (ArgumentException)
    {
        // List not found
    }

    if (null != pagesList)
    {
        SPListItemCollection pages = pagesList.Items;
        foreach (SPListItem page in pages)
        {
            SPFile file = page.File;
            using (SPLimitedWebPartManager mgr = file.GetLimitedWebPartManager(PersonalizationScope.Shared))
            {
                try
                {
                    SPLimitedWebPartCollection webparts = mgr.WebParts;
                    foreach (System.Web.UI.WebControls.WebParts.WebPart wp in webparts)
                    {
                        // Here perform the webpart check
                        // For instance you could identify the web part by
                        // its class name

                        if (webPartName == wp.GetType().ToString())
                        {
                            // Found a match! Now do something...
                            Console.WriteLine("Found web part!");
                        }
                    }
                }
                finally
                {
                    // Needs to be disposed
                    mgr.Web.Dispose();
                }

            }
        }
    }

    // Check sub sites
    SPWebCollection subSites = site.Webs;
    foreach (SPWeb subSite in subSites)
    {
        try
        {
            FindWebPartHelper(subSite, webPartName);
        }
        finally
        {
            // Don't forget to dispose!
            subSite.Dispose();
        }
    }
}

Конечно, вы можете внести небольшие изменения в этот код. В настоящее время выполняется сравнение строк, но это проще сделать более типичным способом. Веселись!

3 голосов
/ 21 июня 2011

В качестве альтернативы, если вы хотите протестировать страницы веб-частей, включая страницу по умолчанию на сайтах совместной работы, вы можете использовать следующий фрагмент кода, который использует свойство Files объекта SPWeb:

private static void FindWebPart(string siteUrl, string webPartName)
{
    using (var site = new SPSite(siteUrl))
    {
        foreach (SPWeb web in site.AllWebs)
        {

            foreach (var file in web.Files.Cast<SPFile>().Where(file => file.Name.EndsWith("aspx")))
            {
                FindWebPartOnPage(webPartName, file);
            }

            var pagesTemplateType = (SPListTemplateType)Enum.Parse(typeof(SPListTemplateType), "850");
            foreach (var documentLibrary in web.Lists.Cast<SPList>().Where(list => list.BaseTemplate == pagesTemplateType || (list.BaseTemplate == SPListTemplateType.DocumentLibrary && list.Title.Contains("Pages"))))
            {
                foreach (var file in documentLibrary.Items.Cast<SPListItem>().Where(item => item.File.Name.EndsWith("aspx")).Select(item => item.File))
                {
                    FindWebPartOnPage(webPartName, file);
                }
            }

            web.Dispose();
        }
    }
}

private static void FindWebPartOnPage(string webPartName, SPFile file)
{
    using (var webPartManager = file.GetLimitedWebPartManager(PersonalizationScope.Shared))
    {
        if (webPartManager.WebParts.Cast<WebPart>().Any(webPart => webPart.GetType().Name == webPartName))
        {
            Console.WriteLine(file.ServerRelativeUrl);
        }

        webPartManager.Web.Dispose();
    }
}

Примечание. Библиотека страниц, созданная с помощью функции публикации, не имеет значения BaseTemplate SPListTemplateType.DocumentLibrary; вместо этого он представлен скрытым значением 850.

Это называется способом, аналогичным ответу Леонзандмана, однако для сопоставления используется только имя класса:

FindWebPart("http://yoursite.com/", "MyWebPart");
...