Проблема: Создание столбца сайта с использованием API-интерфейса SharePoint (объектная модель) с неверным регистром в URL-адресе для объекта SPSite или SPWeb приведет к тому, что новый столбец вызовет исключение, если попытается изменить его производится через галерею колонок сайта.
SharePoint, как правило, очень терпимо относится к принятию URL-адреса без учета регистра, однако в некоторых случаях он полностью выходит из строя. Например, при создании столбца сайта он каким-то образом сохраняет и использует URL-адрес при его создании, а при попытке изменить определение поля через Галерею столбцов сайта (страница fldedit.aspx в LAYOUTS) вы в итоге выкидываете ошибку ниже.
Value does not fall within the expected range.
at Microsoft.SharePoint.SPFieldCollection.GetFieldByInternalName(String strName, Boolean bThrowException)
at Microsoft.SharePoint.SPFieldCollection.GetFieldByInternalName(String strName)
at Microsoft.SharePoint.ApplicationPages.BasicFieldEditPage.OnLoad(EventArgs e)
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
Как я могу надежно получить правильный URL для сайта / сети? Свойства SPSite.Url и SPWeb.Url, похоже, возвращают обратно в любом случае, в котором они созданы.
Другими словами, семейство сайтов подготовлено с использованием следующего URL: http://server/Path/Site
Затем, если я создаю новый столбец сайта с использованием объектной модели SharePoint и использую http://server/path/site при создании экземпляров объектов SPSite и SPWeb, столбец сайта будет доступен, но при попытке доступа к нему через галерея ошибка выше генерируется. Если я исправлю URL-адрес в адресной строке, я все равно смогу просмотреть / изменить определение для рассматриваемого SPField, но сгенерированный URL-адрес по умолчанию является поддельным.
Ясно, как грязь?
Пример кода: (это плохой пример из-за проблемы чувствительности к регистру)
// note: site should be partially caps: http://server/Path/Site
using (SPSite site = new SPSite("http://server/path/site")) {
using (SPWeb web = site.OpenWeb()) {
web.Fields.AddFieldAsXml("..."); // correct XML really here
}
}