CAML из JavaScript для получения всех элементов с доски сообщений SharePoint

Я использую JavaScript для вызова метода GetListItems веб-службы SP и передачи следующего CAML:

    var CAML = "<Query>"
            + "<ViewAttributes Scope=\"Recursive\" />"
            + "<Where>"
            + "<Or>"
            + "<Eq>"
            + "<FieldRef Name=\"ID\"/>"
            + "<Value Type=\"Counter\">" + id + "</Value>"
            + "</Eq>"
            + "<Eq>"
            + "<FieldRef Name=\"ParentFolderId\" />"
            + "<Value Type=\"Integer\">" + id + "</Value>"
            + "</Eq>"
            + "</Or>"
            + "</Where>"
            + "</Query>";

    var fieldinfo = "<ViewFields><FieldRef Name='Title' /><FieldRef Name='Body' /><FieldRef Name='CorrectBodyToShow' /><FieldRef Name='Created' /><FieldRef Name='Author' /><FieldRef Name='Editor' /><FieldRef Name='PersonalImage' /><FieldRef Name='DiscussionLastUpdated' /></ViewFields>"

И я получаю обратно только элемент верхнего уровня... предмет типа обсуждения. Есть 2 элемента типа сообщения, связанные с ParentFolderId, равным 1, но они не возвращаются.

Кроме того, если я запускаю CAML в инструменте U2U, он ДЕЙСТВИТЕЛЬНО возвращает весь поток... одно обсуждение и два сообщения.


person John Weaver    schedule 26.02.2010    source источник


Ответы (3)


Вам нужно установить свойство под названием Scope=Recursive. Вы сделали это в своем CAML, но не в том месте.

Если вы используете объектную модель, вы должны использовать

query.ViewAttributes = "Scope=\"Recursive\" ";

Однако вы используете веб-сервис. В вашем примере вы поместили ViewAttributes в качестве дочернего элемента узла Query, но это неверно.

Он должен быть частью параметра queryOptions в Получитьэлементы списка

Таким образом, в дополнение к вашему коду выше вам понадобится

   var queryOptions = "<QueryOptions>" +
                         "<ViewAttributes Scope='Recursive' />" +
                      "</QueryOptions>";

Затем внутри вашей оболочки javascript вы должны назвать это примерно так: (ПРИМЕЧАНИЕ - это, очевидно, не будет работать как есть, но вы поняли идею)

listService.GetListItems("List_Name", null,
                         CAML, fieldinfo , null, 
                         queryOptions, null);
person Ryan    schedule 27.02.2010
comment
Поскольку оболочка сворачивает все в конверт SOAP, который передается веб-службе, должен ли я просто добавить новые параметры запроса в качестве узла корневого уровня в тело SOAP? - person John Weaver; 01.03.2010
comment
Я бы подумал, что это что-то в этом роде. Параметры запроса - это отдельный параметр при вызове веб-службы .GetListItems, и он будет помещен где-то в запросе SOAP, но я никогда раньше не работал с необработанными запросами SOAP (VS делает всю сантехнику за вас), поэтому не совсем уверен. - person Ryan; 01.03.2010

рекурсивная функция является частью объекта параметров запроса, а не объекта параметров просмотра в веб-службе.

person Brian Brinley    schedule 27.02.2010

У меня есть подозрение, что вам нужно установить отказ в объекте SPQuery, а не в запросе caml, например:

qry.ExpandRecurrence = true

но я могу ошибаться :) Я обнаружил, что некоторая сортировка тоже не всегда работает.

person Jonesie    schedule 26.02.2010
comment
Я думаю, вы что-то поняли... предыдущий консультант создал оболочку javascript, которую мы вызываем, чтобы преобразовать CAML в конверт SOAP. У вас есть идеи, где установить ExpandRecurrence? - person John Weaver; 27.02.2010
comment
Не знаю, зачем вам мыло. Можете ли вы создать aspx на сервере, а не использовать веб-сервисы? Если это так, вы можете использовать в этом объект SPQuery. Если нет, то вам нужно закодировать рекурсивную функциональность в js. - person Jonesie; 27.02.2010
comment
О, есть комментарий к этому сообщению в блоге, который может помочь: u2u.info/Блоги/Патрик/Списки/Сообщения/Post.aspx?ID=1765 - person Jonesie; 27.02.2010
comment
Думаю, вы ошиблись: ExpandRecurrances относится к спискам событий (например, спискам календаря) и повторяющимся событиям, а не к папкам msdn.microsoft.com/en-us/library/ - person Ryan; 27.02.2010