質問

サイトが作成されたときに、サイトからいくつかのWebパートを削除したいと思います。カスタムコードを実行する機能をホチキス止めしました。 Brevityのために編集された、以下のことの基本を添付しました。

動作しますが、私のサイトを作成すると、エラーメッセージが表示されます。「Webパーツが別のユーザーによって削除されたか、無効であるため、操作が完了できませんでした」と思います。スレッドは削除の途中です。更新すると、ページは正常に読み込まれます。

これを回避する方法はありますか?

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チームのブログに関するSteve Peschkaのブログ投稿に記載されているとおりです。 http://blogs.msdn.com/sharepoint/archive/2007/03/22/customizing-moss-2007-my-sites-within-the-enterprise.aspx

他のヒント

ここでの問題は、Webパーツコレクションを反復するのと同時に変更していることです。別のコレクションを構築し、それを削除に使用する必要があります。

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();

私がこれを常に行った方法は、Webパートを削除するが、どのサイトにも星を作らない別の機能を作成することです。それから、2つのことをキックオフするサイトにホチキス止めされた別の機能があります。

1つは、スレッドを使用したところ、かなりうまく機能しますが、あなたとは少し異なりました。

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%は、少し遅れた後にそれを処理するタイマージョブがあります。

サイトプロビジョニング中にこのようなバックグラウンドスレッドを使用することはありません。失敗するだけです。

あなたの場合、私はWebパーツなしでMSITEサイト定義のコピーを作成し、代わりに私のサイトにそのサイトdefを使用します。

ライセンス: CC-BY-SA帰属
所属していません sharepoint.stackexchange
scroll top