Вопрос

У меня возникла проблема с пользовательским столбцом сайта в SP2007, тип поля которого недавно изменился.Я определил функции для следующих артефактов, которые развертываются в области семейства сайтов:

  1. Функция, содержащая несколько пользовательских столбцов сайта
  2. Функция, содержащая пользовательский тип контента, который ссылается на пользовательские столбцы сайта с помощью элемента
  3. Функция, содержащая пользовательский шаблон списка (основанный на встроенном шаблоне пользовательского списка), который ссылается на пользовательские столбцы сайта и применяет пользовательский тип контента.

Недавно мы изменили схему одного из пользовательских столбцов сайта.В частности, мы изменили атрибут "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 изменение типа используемых полей не поддерживается.

Моя рекомендация была бы такой:

  1. Сделайте резервную копию на случай, если откат каким-то образом решит проблему.
  2. Верните схему полей обратно в "текст".
  3. Используйте другой подход для изменения типа поля, а именно:
  4. Укажите новое поле примечания
  5. Напишите код для перебора всех списков и копирования данных из старого поля в новое
  6. Пометьте старое поле как скрытое

Очевидно, что вам будет о чем подумать, если у вас много сайтов / веб-страниц / списков / элементов списка, но вам придется столкнуться с проблемой масштабирования, даже если вы не пошли по первоначальному маршруту.

На случай, если это полезно, вот код, который я использовал (в моем случае, в событии обновления функций 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);
                        }
                    }
                }
            });
        }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с sharepoint.stackexchange
scroll top