Веб-службы SharePoint - обновление поля ContentType Обязательное свойство? - PullRequest
1 голос
/ 04 августа 2009

Я пытался программным образом воспроизвести поведение редактирования свойств поля типа контента на экране управления сайтом SharePoint и безуспешного выбора радиокнопки «Требуется» с помощью метода «UpdateContentType» веб-службы WSS 3.0. .

Первой трудностью была проблема с документацией MSDN о том, что поля должны быть типа FieldRef, тогда как на самом деле они должны иметь тип поля ( ссылка ). Добавление полей и удаление полей работает нормально после исправления, но обновление полей, похоже, не работает вообще. (Следует также отметить, что я следовал рекомендации по предыдущей ссылке, чтобы использовать Method="2" для обновления полей, но это ничего не меняет, и использование значений метода, отличных от 1 для добавления или отличных от 3 для удаления, также работает правильно).

Вот вызов веб-службы (слегка измененный для удобства чтения со строками вместо объектов XmlNode):

SharePointWebServices.Webs webService = new SharePointWebServices.Webs();
webService.Url = "http://mysharepointserver/site";
webService.UseDefaultCredentials = true;

webService.UpdateContentType(
    @"0x01005A089D9EC8A382458FB1F6C72096D52A", 
    @"<ContentType />", 
    @"<Fields />",
    @"<Fields><Method ID=""1""><Field Name=""SomeField"" ID=""{8a4803c4-6545-4a7a-804d-237eebff0ce3}"" Required=""TRUE"" Hidden=""FALSE"" ReadOnly=""FALSE"" PITarget="""" PIAttribute="""" PrimaryPIAttribute="""" Aggregation="""" Node="""" /></Method></Fields>",
    @"<Fields />");

После вызова поле все еще обязательное = "ЛОЖЬ".

Быстрый просмотр сборки stssoap.dll показывает, что свойство «Required», по-видимому, игнорируется в процессе обновления. Это нормальное поведение? Если да, то каков рекомендуемый метод программного изменения поля «Обязательно» из кода клиента (не выполняется на сервере SharePoint)?

Любая помощь будет принята с благодарностью.

1 Ответ

2 голосов
/ 12 августа 2009

Я исследовал это и нашел то же самое. Я также попытался добавить атрибут Cmd="Update" к элементу Method, но безуспешно. Этот пример того, как использовать UpdateContentType, также был полезен.

Я не верю, что вы сможете сделать это с помощью готовых служб SharePoint. Посмотрев файл stssoap.dll, вы убедились, что он работает неправильно. Другой вариант в стиле «клиент» - это использование RPC-методов , но ни один из них не обеспечивает функциональность для типов контента вообще.

Веб-сервисы особенно разочаровывают, потому что этот тип не очень острого случая регулярно появляется. Я редко использую их, потому что тратит время на их ограничения.

У вас есть какая-либо опция для развертывания пользовательского кода на сервере? Вы можете разработать эту функциональность, используя объектную модель, и обернуть ее в свой собственный веб-сервис (здесь пошаговое руководство ) довольно легко.

Вот пример, адаптированный из Гейб Вишни , который делает то, что вам нужно:

SPContentType myContentType = myWeb.ContentTypes["myContentType"];
string internalName = myContentType.Fields["fieldToUpdate"].InternalName;
myContentType.FieldLinks[internalName].Required = false;
myContentType.Update(true);

Извините, это не более полезно, но это обычная история при использовании веб-служб WSS 3.0 / SharePoint 2007.

...