Изменение типа неподдерживаемого поля
-
16-10-2019 - |
Вопрос
У меня возникла проблема с пользовательским столбцом сайта в SP2007, тип поля которого недавно изменился.Я определил функции для следующих артефактов, которые развертываются в области семейства сайтов:
- Функция, содержащая несколько пользовательских столбцов сайта
- Функция, содержащая пользовательский тип контента, который ссылается на пользовательские столбцы сайта с помощью элемента
- Функция, содержащая пользовательский шаблон списка (основанный на встроенном шаблоне пользовательского списка), который ссылается на пользовательские столбцы сайта и применяет пользовательский тип контента.
Недавно мы изменили схему одного из пользовательских столбцов сайта.В частности, мы изменили атрибут "Type" с "Text" на "Note".Вот исходная схема:
<Field ID="{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}"
SourceID="http://schemas.microsoft.com/sharepoint/v3"
Name="CurrentStatus"
StaticName="CurrentStatus"
Group="My Site Columns"
ColName="CurrentStatus"
Type="Text"
ShowInEditForm="FALSE"
ShowInNewForm="FALSE"
ShowInFileDlg="FALSE"
DisplayName="Current Status"
Description="The current status.">
</Field>
И вот обновленная схема с новым типом "Примечание":
<Field ID="{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}"
SourceID="http://schemas.microsoft.com/sharepoint/v3"
Name="CurrentStatus"
StaticName="CurrentStatus"
Group="My Site Columns"
ColName="CurrentStatus"
Type="Note"
RichText="TRUE"
IsolateStyles="TRUE"
RichTextMode="FullHtml"
ShowInEditForm="FALSE"
ShowInNewForm="FALSE"
ShowInFileDlg="FALSE"
DisplayName="Current Status"
Description="The current status.">
</Field>
Теперь я признаю, что это изменение не поддерживается, и я планирую избегать его любой ценой в будущем.Но в ходе нашего первоначального тестирования мы обнаружили, что все наши существующие списки (созданные с использованием старой схемы столбцов сайта) были, по-видимому, обновлены до новой схемы после развертывания новых функций.Однако иногда в некоторых системах мы обнаруживаем, что следующая ошибка возникает всякий раз, когда кто-то пытается создать новый экземпляр списка из нашего шаблона:
Изменение типа неподдерживаемого поля.
Поле не может быть изменено на новый тип.Пожалуйста, проверьте новый тип и повторите попытку.в Microsoft.SharePoint.Библиотека.SPRequestInternalClass.UpdateField(строка bstrUrl, строка bstrListName, строка bstrXML) в Microsoft.SharePoint.Библиотека.Запрос.Поле обновления (строка bstrUrl, Строка bstrListName, строка bstrXML)
Есть ли что-нибудь, что мы можем сделать, чтобы устранить проблему (кроме возврата к схеме полей), или мы застряли?
Решение
Интересно - я использовал именно этот сценарий (обновление поля из текста в примечание) в демонстрации недавно на конференции, чтобы продемонстрировать новую платформу обновляемых функций SharePoint 2010.Как вы обнаружили, как в SP2007, так и в SP2010 изменение типа используемых полей не поддерживается.
Моя рекомендация была бы такой:
- Сделайте резервную копию на случай, если откат каким-то образом решит проблему.
- Верните схему полей обратно в "текст".
- Используйте другой подход для изменения типа поля, а именно:
- Укажите новое поле примечания
- Напишите код для перебора всех списков и копирования данных из старого поля в новое
- Пометьте старое поле как скрытое
Очевидно, что вам будет о чем подумать, если у вас много сайтов / веб-страниц / списков / элементов списка, но вам придется столкнуться с проблемой масштабирования, даже если вы не пошли по первоначальному маршруту.
На случай, если это полезно, вот код, который я использовал (в моем случае, в событии обновления функций SP2010, но вы могли бы с таким же успехом использовать его в событии активации функций или подобном).Обратите внимание, что это было в веб-функции, которая была обновлена (т. е.активирован для SP2007) на всех веб-сайтах, содержащих список:
List<SPField> fieldsToUpgrade = new List<SPField>();
// find all the lists in this web using the 'Tourist Activity' content type..
SPListCollection genericLists = parentWeb.GetListsOfType(SPBaseType.GenericList);
foreach (SPList list in genericLists)
{
if (list.ContentTypes[contentTypeName] != null)
{
// copy list data to new field..
foreach (SPListItem item in list.Items)
{
item[newFieldName] = item[oldFieldName];
item.SystemUpdate();
}
// mark old field as hidden..
SPField oldField = list.Fields.GetField(oldFieldName);
fieldsToUpgrade.Add(oldField);
}
}
foreach (SPField field in fieldsToUpgrade)
{
field.Hidden = true;
field.Update();
}
Другие советы
Вы можете сделать это на моем пути.
private static void ChangeFieldType() {
SPSecurity.RunWithElevatedPrivileges(delegate() {
using (SPSite site = new SPSite("YourSiteUrl")) {
using (SPWeb web = site.OpenWeb("YourWebUrl") {
try {
web.AllowUnsafeUpdates = true;
SPList list = web.Lists["YourListName"];
SPField changeTypeField = list.Fields["YourField"];
string schema;
schema = changeTypeField.SchemaXml;
schema = schema.Replace("Type=\"Text\"", "Type=\"Note\"");
changeTypeField.SchemaXml = schema;
changeTypeField.Update();
web.AllowUnsafeUpdates = false;
} catch (Exception e) {
Console.WriteLine(e.Message);
}
}
}
});
}