如何从我的网站上删除WebParts创建
-
16-10-2019 - |
题
我想在创建网站时从网站上删除一些网页。我已经为运行自定义代码的功能准备了一个功能。我已经附加了下面所做的基础知识,以简洁的态度编辑。
它有效,但是当您创建我的网站时,您会收到错误消息:“操作无法完成,因为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网站。