Question

Je veux supprimer certains des webparts de mes sites quand ils sont créés. J'ai agrafé une fonction qui exécute le code personnalisé. J'ai attaché les bases de ce qu'il fait ci-dessous, édité par souci de concision.

Il fonctionne, mais lorsque vous créez un mon site vous obtenez le message d'erreur « L'opération n'a pas pu être terminée, car la partie Web a été supprimé par un autre utilisateur ou est invalide. », Je suppose, car il essaie de charger les webparts que le fil de fond est à mi-chemin à travers la suppression. Actualiser et la page se charge très bien.

Toutes les idées comment contourner ce?

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();
}
Était-ce utile?

La solution

La façon dont je le fais est tel que décrit dans le blog de Steve Peschka sur le blog de l'équipe SharePoint: http://blogs.msdn.com/sharepoint/archive/2007/03/22/customizing-moss-2007-my-sites -Dans-la-enterprise.aspx

Autres conseils

Le problème ici est que vous modifiez la collection de pièces Web en même temps que itérer à travers elle. Vous devez construire une collecte séparée et ensuite utiliser que pour la suppression par exemple:.

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

La façon dont je l'ai toujours fait cela est de créer une autre caractéristique qui supprimerait les webparts mais pas agrafer à tous les sites. Ensuite, j'aurais une autre caractéristique qui est agrafé aux sites qui le coup d'envoi de deux choses:

Un, j'ai utilisé des fils et cela fonctionne assez bien, mais je l'ai fait un peu différent de celui que vous:

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

et puis quelque chose do j'activer la fonction non agrafé.

Deux. Je voudrais ajouter un ensemble de travail du minuteur un temps pour exécuter en 5 minutes qui serait également activer la même caractéristique.

De cette façon, 99% du temps le fil serait exécuter correctement, mais le 1% qui ne fait pas, il y a un travail de minuteur qui prendra en charge après un peu de retard.

Je ne jamais aller avec un fil de fond comme celui-ci pendant le site d'approvisionnement, il est juste fait échouer.

Dans votre cas, je créerais une copie de la définition du site MSITE, sans les parties Web et d'utiliser ce site def pour les sites Mes place.

Licencié sous: CC-BY-SA avec attribution
Non affilié à sharepoint.stackexchange
scroll top