之前我没有使用过webparts for sharepoint,但是需要对webpart进行更改,需要将其传播到大约700个网站。它是对webpart的一个属性的更改,需要更改值。有没有办法获取webpart的元数据并直接在数据库中更改它(我假设它是存储它的位置。)?
以下是场景:Webpart包含应显示的以逗号分隔的文档类型列表(内部类型)。现在有新的文档。需要添加到所有700个网站的类型。我需要一种方法来枚举网站,获取webpart元数据,并将这些新的doc类型添加到webpart。目前,他们手动访问每个网站,点击编辑,输入新的文档类型,然后保存。
答案 0 :(得分:3)
直接访问sharepoint内容数据库是一个很大的“不行”。这是官方的答案。 :)
话虽如此,我只是查看了内容数据库,从未尝试过手动更改任何内容。
我的建议是,修改现有的Web部件,根据当前设置的属性修改属性。 (我假设某些当前设置的属性无效或需要根据对基础结构的更改进行更新。)...如果是这种情况,您可以验证属性;确保将当前属性更改为所需属性,和/或确保将来的属性更改有效。
祝你好运!答案 1 :(得分:3)
<强>不强>
说真的,不要进入内容数据库并进行编辑。这样,如果发生任何事情,您将不再受支持,并且Microsoft将不再支持您(直到您将数据库从备份恢复为早期版本)。
您可以使用API访问您网站中的网站部分,这里有一些可以帮助您入门的代码:
答案 2 :(得分:3)
正如其他人所说,正确的方法是以编程方式实现这一目标,而不是编辑内容数据库,这将使您的安装不受支持。我经常使用控制台应用程序在由网站模板创建的网站组成的网站集中执行此操作。
这是一个更改ListViewWebPart的Title属性的示例。更新为包含递归循环的代码。我没有测试过这个,但它应该可以工作。
private static void ProcessSiteCollection(string url)
{
using (SPSite siteCollection = new SPSite(url))
{
SPWeb rootWeb = siteCollection.RootWeb;
ProcessWebs(rootWeb);
}
}
private static void ProcessWebs(SPWeb parentWeb)
{
foreach (SPWeb web in parentWeb.Webs)
{
try
{
UpdateWebPart(web); // Set web part properties
ProcessWebs(web); // Recursively loop through children
}
finally
{
web.Dispose();
}
}
}
private static void UpdateWebPart(SPWeb web)
{
using (SPLimitedWebPartManager webPartManager =
web.GetLimitedWebPartManager("default.aspx", PersonalizationScope.Shared))
{
try
{
foreach (WebPart webPart in webPartManager.WebParts)
{
if (webPart.Title == "My Web Part")
{
ListViewWebPart listViewWebPart = (ListViewWebPart)webPart;
listViewWebPart.Title = "Updated Web Part";
webPartManager.SaveChanges(listViewWebPart);
web.Update();
break;
}
}
}
finally
{
webPartManager.Web.Dispose();
}
}
}