SharePoint 2010: функция повторного развертывания добавляет дубликаты веб-частей на страницу
Я готовлю страницу публикации как часть функции и размещаю на ней веб-часть с одним списком (см. Код ниже). Все это прекрасно работает.
<Elements>
<Module>
<File Path="default.aspx" Url="BulletinBoard.aspx" Type="GhostableInLibrary" IgnoreIfAlreadyExists="TRUE">
<Property Name="Title" Value="Bulletin Board" />
<Property Name="PublishingPageLayout" Value="~SiteCollection/_catalogs/masterpage/ListNewsletterStyle.aspx" />
<Property Name="ContentType" Value="Page" />
<Property Name="PublishingPageImage" Value="" />
<View List="Lists/BulletinBoard" BaseViewID="2" WebPartZoneID="Main" WebPartOrder="1">
<![CDATA[
<webParts>
<webPart xmlns="http://schemas.microsoft.com/WebPart/v3">
<metaData>
<type name="Microsoft.SharePoint.WebPartPages.XsltListViewWebPart,Microsoft.SharePoint,Version=14.0.0.0,Culture=neutral,PublicKeyToken=71e9bce111e9429c" />
<importErrorMessage>Cannot import this Web Part.</importErrorMessage>
</metaData>
<data>
<properties>
<property name="Title">Active Announcements</property>
<property name="ChromeType">None</property>
</properties>
</data>
</webPart>
</webParts>
]]>
</View>
</File>
</Module>
</Elements>
Единственная проблема заключается в том, что каждый раз, когда я повторно внедряю свою функцию через Visual Studio, веб-часть представления списка дублируется (т. Е. Другая добавляется в зону веб-части).
Эта проблема затрагивает только веб-части с тегом
Как мне это предотвратить?
3 ответа
Вы можете добавить приемник функций и добавить веб-часть, если она еще не существует вместо добавления веб-части в XML. Что вы подразумеваете под тегом?
Проверьте эту запись в блоге от Waldek Mastykarz. Он имеет код C# ниже, который должен быть похож на то, что вы ищете.
using (SPSite site = new SPSite("http://sharepoint"))
{
SPList list = site.GetCatalog(SPListTemplateType.MasterPageCatalog);
SPListItemCollection items = list.Items;
List<string> webParts = new List<string>();
// find the right Page Layout
foreach (SPListItem item in items)
{
if (item.Name.Equals("CustomPageLayout.aspx",
StringComparison.CurrentCultureIgnoreCase))
{
SPFile file = item.File;
// get the Web Part Manager for the Page Layout
SPLimitedWebPartManager wpm =
file.GetLimitedWebPartManager(PersonalizationScope.Shared);
// iterate through all Web Parts and remove duplicates
while (wpm.WebParts.Count > 0)
{
StringBuilder sb = new StringBuilder();
XmlWriterSettings xws = new XmlWriterSettings();
xws.OmitXmlDeclaration = true;
XmlWriter xw = XmlWriter.Create(sb, xws);
System.Web.UI.WebControls.WebParts.WebPart wp =
wpm.WebParts[0];
wpm.ExportWebPart(wp, xw);
xw.Flush();
string md5Hash = getMd5Hash(sb.ToString());
if (webParts.Contains(md5Hash))
wpm.DeleteWebPart(wp);
else
webParts.Add(md5Hash);
}
}
}
}
Примечание для пользователей SharePoint 2013. Вы должны добавить ReplaceContent=True к тегу. Проблема с дубликатами веб-частей будет решена.