Как удалить веб -части с моего сайта на создании

sharepoint.stackexchange https://sharepoint.stackexchange.com/questions/2562

  •  16-10-2019
  •  | 
  •  

Вопрос

Я хочу удалить некоторые из веб -частей с моих сайтов, когда они созданы. Я скрепил функцию, которая запускает пользовательский код. Я приложил основы того, что он делает ниже, отредактировано для краткости.

Он работает, но когда вы создаете мой сайт, вы получаете сообщение об ошибке «Операция не может быть завершена, потому что веб -часть была удалена другим пользователем или недействительна». Я предполагаю, что она пытается загрузить веб -части, которые фоновый Поток на полпути к удалению. Обновить, и страница загружается нормально.

Есть идеи, как обойти это?

public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
    thread.Start(deletethestuff)        
}

public override void DeleteTheStuff
{
    while (checksiteisprovisioned == false) Thread.Sleep(1000);

    SPFile page = web.RootFolder.Files["default.aspx"];
    SPLimitedWebPartManager manager = page.GetLimitedWebPartManager(PersonalizationScope.Shared));
    foreach (Microsoft.SharePoint.WebPartPages.WebPart webPart in webParts)
    {
        if (webPart.Title == "onetodelete")
        {
            manager.DeleteWebPart(webPart);
        }
    }
    page.Update();
}
Это было полезно?

Решение

То, как я это делаю, так же, как описано в блоге Стива Печки в блоге команды SharePoint: http://blogs.msdn.com/sharepoint/archive/2007/03/22/customizing-moss-2007-my-sites-within-the-enterprise.aspx

Другие советы

Проблема здесь в том, что вы изменяете коллекцию веб -частей одновременно с итерацией через нее. Вам нужно создать отдельную коллекцию, а затем использовать ее для удаления, например:

SPFile page = web.RootFolder.Files["default.aspx"];
SPLimitedWebPartManager wpmShared = page.GetLimitedWebPartManager(PersonalizationScope.Shared);

List<WebPart> partsToProcess = new List<WebPart>();

foreach (WebPart part in wpmShared.WebParts)
{
     if (part.Title == "onetodelete")
     {
         partsToProcess.Add(part);
     }
}

foreach (WebPart webPart in partsToProcess)
{
     wpmShared.DeleteWebPart(webPart);
}     

page.Update();

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

Во -первых, я использовал потоки, и это работает довольно хорошо, но я сделал это немного отличается от вас:

public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
    using (SPWeb web = (SPWeb)properties.Feature.Parent)
    {
        if (web == null) throw new ApplicationException("Web could not be found");

        ThreadPool.QueueUserWorkItem(new WaitCallback(RunProcess), web.Url);
    }
}

private void RunProcess(object state)
{
    bool provisioned = false;
    SPWeb web = null;

    try
    {
        for (int i = 0; i < 100 && provisioned == false; i++)
        {
            try
            {
                string url = (string)state;
                using (SPSite site = new SPSite(url))
                {
                    web = site.OpenWeb();
                    if (web.Provisioned)
                    {
                        provisioned = true;
                        break;
                    }

                    if (web != null)
                    {
                        web.Dispose();
                    }

                    Thread.Sleep(3000);
                }
            }
            catch { }
            finally
            {
                if (web != null &&
                    provisioned == false)
                {
                    web.Dispose();
                }
            }
        }

        if (provisioned)
        {
            DoSomething(web);
        }
        else
        {
            throw new ApplicationException("Web site never provisioned");
        }
    }
    finally
    {
        if (web != null)
        {
            web.Dispose();
        }
    }
}

А потом сделаю то, что я бы активировал неостановленную функцию.

Два. Я бы добавил один раз набор заданий таймера, чтобы запустить за 5 минут, который также активировал бы ту же функцию.

Таким образом, 99% случаев, когда поток будет выполнять правильно, но 1%, который нет, есть задача таймера, которая позаботится о нем после небольшой задержки.

Я бы никогда не пошел бы с такой фоновой темой, как этот, во время обеспечения сайта, он просто сделан для провала.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с sharepoint.stackexchange
scroll top