Frage

Ich möchte einige der Webparts von meinen Websites löschen, wenn sie erstellt werden. Ich habe eine Funktion, in der benutzerdefinierte Code ausgeführt wird. Ich habe die Grundlagen dessen beigefügt, was es unten tut, bearbeitet für Kürze.

Es funktioniert jedoch, aber wenn Sie eine My -Site erstellen, erhalten Sie die Fehlermeldung "Die Operation kann nicht abgeschlossen werden, da das Webpart von einem anderen Benutzer gelöscht wurde oder ungültig ist." Der Faden ist zur Hälfte des Löschens. Aktualisieren und die Seite lädt gut.

Irgendwelche Ideen, wie man das umgeht?

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();
}
War es hilfreich?

Lösung

Die Art und Weise, wie ich dies mache, wird wie in Steve Peschkas Blog -Beitrag im SharePoint -Team -Blog beschrieben: http://blogs.msdn.com/sharepoint/archive/2007/03/22/customizing-moss-2007-my-siten-within-the-erprise.aspx

Andere Tipps

Das Problem hier ist, dass Sie die Web -Teile -Sammlung gleichzeitig mit der Iterie ändern. Sie müssen eine separate Sammlung erstellen und diese dann für die Löschung verwenden, z.

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

Ich habe dies immer getan, um eine andere Funktion zu erstellen, die die Webparts löscht, aber nicht auf Websites hefte. Dann würde ich ein weiteres Feature haben, das auf den Websites gefangen genommen wird, die zwei Dinge beginnen würden:

Erstens habe ich Threads verwendet und es funktioniert ziemlich gut, aber ich habe es etwas anders gemacht als Sie:

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

Und dann würde ich etwas tun, das ich die nicht abgeschmolzene Funktion aktivieren würde.

Zwei. Ich würde einen einmaligen Timer -Job hinzufügen, der in 5 Minuten ausgeführt wird, das auch dieselbe Funktion aktiviert.

Auf diese Weise würde in 99% der Fälle, in denen der Thread korrekt ausgeführt wird, aber die 1%, die es nicht tun, es gibt einen Timerjob, der sich nach ein wenig Verzögerung darum kümmert.

Ich würde während der Site -Bereitstellung niemals mit einem solchen Hintergrund -Thread gehen, es wird nur gescheitert.

In Ihrem Fall würde ich eine Kopie der MSite -Site -Definition ohne Webteile erstellen und diese Site Def stattdessen für die My -Websites verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit sharepoint.stackexchange
scroll top