在SharePoint中停用Web部件功能

4
我使用wspbuilder工具(具有功能的Web部件)开发了一个Web部件。
在部署到网站集合后,您必须激活该功能才能使用此Web部件 - 到目前为止还不错。
然而,在停用功能时,Web部件仍然存在于添加它的任何站点,并且此外,它仍然可以在Web部件库中使用?
这是预期的行为吗?是否没有办法从网站集合中的所有子网站中删除Web部件,并将其从Web部件库中删除?
谢谢;)
3个回答

2

我也了解一些功能接收器,并尝试过对其进行调整。然而,我似乎完全无法将使用它的站点中的 Web 部件删除。我还没有攻击 Web 部件库,因为我想先从子站点中删除它。 - Dynde
在从 WebPart 图库中删除 WebPart 之前,您可能需要使用 WebPartManager 从站点中删除其实例。 - Shaneo
2
在页面上仍在使用的情况下,从 Web Part Gallery 中删除 Web 部件是完全安全的。现有实例将继续工作,但用户无法创建新实例。您可以通过用户界面执行相同的操作。正如 Shaneo 所述,您需要检查每个站点的每个页面,并使用 WebPartManager 或 LimitedWebPartManager 删除 Web 部件。无论您在从 Web Part Gallery 中删除 Web 部件之前还是之后执行此操作都没有关系。 - Tom Vervoort
好的...所以我肯定应该能够使用LimitedWebPartManager删除Web部件吗?因为这就是我正在尝试做的事情。 我有一个SPWeb.SPLimitedWebPartManager.WebParts中所有Web部件的循环。在此循环中,我打印所有Web部件的标题,并尝试使用SPLWPM().DeleteWebPart(myWebPart)删除我的特定Web部件;但是绝对什么都没有发生 :/ - Dynde
1
在删除 Web 部件后,您应该调用 SPLWPM.Web.Update()。此外,请确保将 LimitedWebPartManager 放入 using 块中(它实现了 IDisposable),并在退出块之前调用 SPLWPM.Web.Dispose()。这可以防止由对象模型中的错误引起的内存泄漏。 - Tom Vervoort

0
你可以使用以下代码来实现:
public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
{
    SPSite site = properties.Feature.Parent as SPSite;

    if (site != null)
    {
        try
        {
            SPList wpGallery = site.GetCatalog(SPListTemplateType.WebPartCatalog);
            SPQuery query = new SPQuery();
            query.Query = “<Where><Eq><FieldRef Name=’FileLeafRef’ /><Value Type=’Text’>webpartname.webpart</Value></Eq></Where>”;
            SPListItemCollection items = wpGallery.GetItems(query);

            if (items.Count > 0)
            {
                items[0].Delete();
            }
        }
        catch { }
    }
}

0

当您创建 Web 部件时,WSPBuilder 会自动将删除事件接收器添加到功能中。非常方便。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接