我想在创建网站时从网站上删除一些网页。我已经为运行自定义代码的功能准备了一个功能。我已经附加了下面所做的基础知识,以简洁的态度编辑。

它有效,但是当您创建我的网站时,您会收到错误消息:“操作无法完成,因为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();
}
有帮助吗?

解决方案

我这样做的方式如史蒂夫·佩奇卡(Steve Peschka)在SharePoint团队博客上的博客文章中所述: http://blogs.msdn.com/sharepoint/archive/2007/03/22/customizing-moss-2007-my-sites-within-the-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();

我一直这样做的方式是创建另一个可以删除WebParts但不会将其列入任何站点的功能。然后,我将拥有另一个功能,这些功能将列入将启动两件事的网站:

第一,我使用了线程,它运行良好,但我做的与您略有不同:

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站点定义的副本,而无需Web零件,并将该站点DEF用于MY网站。

许可以下: CC-BY-SA归因
scroll top