Проблема возникла из ниоткуда, при стандартном развертывании узла из нашего шаблона на котором содержались веб части
DataViewWebPart и ListFormWebPart происходила ошибка при обращении к данной странице, самое смешное что на другой странице при использовании данного метода все работало. Так что пришлось применить жесткий Хак, создать обработчик на создание страниц
OnActivated(
SPFeatureReceiverProperties properties) и в коде данного метода использовать методику Cut & Paste для изменения кода страницы. Проблема была в DataViewWebPart в чем там дело мы так и не разобрались так что пришлось сделать так, а не через обьектную модель WSS. В ходе работы нашел несколько интересных и мало описанных решений для создания веб частей программным методом. Их я приведу ниже.
// Return a SharePoint list filtered by query as a data source
static SPDataSource GetDataSource(string dataSourceId, string webUrl, SPList list, string query, uint maximumRow) {
SPDataSource dataSource = new SPDataSource(); dataSource.UseInternalName =
true; dataSource.ID = dataSourceId;
dataSource.DataSourceMode =
SPDataSourceMode.List; dataSource.List = list;
dataSource.SelectCommand =
"<View>" + query + "</View>"; Parameter listIdParam = new Parameter("ListID"); listIdParam.DefaultValue = list.ID.ToString(
"B").ToUpper(); Parameter maximumRowsParam = new Parameter("MaximumRows"); maximumRowsParam.DefaultValue = maximumRow.ToString();
QueryStringParameter rootFolderParam = new QueryStringParameter("RootFolder", "RootFolder"); dataSource.SelectParameters.Add(listIdParam);
dataSource.SelectParameters.Add(maximumRowsParam);
dataSource.SelectParameters.Add(rootFolderParam);
dataSource.UpdateParameters.Add(listIdParam);
dataSource.DeleteParameters.Add(listIdParam);
dataSource.InsertParameters.Add(listIdParam);
return dataSource; }
// Create or Update a DataView programmatically public static bool CreateOrUpdateDataViewWebpart(string webUrl, string listName, string pageUrl, string xslLink, string zoneName, string webPartName, string titleUrl, bool needsUpdate, string query, uint index, uint maximumRow, PersonalizationScope personalizationScope )
{
bool viewCreatedOrUpdated = false; System.Web.UI.WebControls.WebParts.
WebPart wp = null; wsswp.
DataFormWebPart dataFormWebPart = null; using (SPSite site = new SPSite(webUrl)) using (SPWeb web = site.OpenWeb()) {
web.AllowUnsafeUpdates =
true; SPList list = web.Lists[listName]; wsswp.
SPLimitedWebPartManager wpManager = web.GetLimitedWebPartManager(pageUrl, personalizationScope); foreach (Microsoft.SharePoint.WebPartPages.WebPart wpTemp in wpManager.WebParts) {
if (String.Compare(webPartName, wpTemp.Title, true) == 0) {
wp = wpTemp;
break; }
}
string dataSourceId = webPartName; if (wp == null) {
// Create a webpart dataFormWebPart =
new wsswp.DataFormWebPart(); dataFormWebPart.TitleUrl = titleUrl;
dataFormWebPart.ZoneID = zoneName;
dataFormWebPart.Title = webPartName;
dataFormWebPart.XslLink = xslLink;
SPDataSource dataSource = GetDataSource(dataSourceId, webUrl, list, query, maximumRow); dataFormWebPart.DataSources.Add(dataSource);
wpManager.AddWebPart(dataFormWebPart, webPartName, (
int)index); viewCreatedOrUpdated =
true; }
else {
// Update an existing webpart if (needsUpdate) {
dataFormWebPart = (wsswp.
DataFormWebPart)wp; dataFormWebPart.TitleUrl = titleUrl;
dataFormWebPart.DataSourceID =
string.Empty; SPDataSource dataSource = GetDataSource(dataSourceId, webUrl, list, query, maximumRow); dataFormWebPart.DataSources.Clear();
dataFormWebPart.DataSources.Add(dataSource);
wpManager.SaveChanges(dataFormWebPart);
viewCreatedOrUpdated =
true; }
}
return viewCreatedOrUpdated;
}
}