В предыдущем посте я рассказывал про малоизвестные фичи SharePoint. О них не написано в книгах, мало информации в MSDN и только в паре блогов можно прочитать о них хоть что-нибудь.
В этом посте я расскажу про 3 абсолютно никому неизвестные фичи, которые были были найдены мной и коллегами в SharePoint. Скорее всего другой информации по этим фичам вы не найдете.
Третье место
Третье место в хит-параде занимают атрибуты Len и MoreText для элемента FieldRef во ViewFields в схеме CAML запроса (SPQuery). В документации эти атрибуты отсутствуют. Если указать эти атрибуты для текстового поля, то SharePoint в этом поле вернет урезанную строку, которая вмещается в указанное в Len количество символов, в конце допишет текст, указанный в MoreText.
Причем обрезка текста происходит по границе слова, а не просто по количеству символов. К сожалению не учитывается Html разметка.
Вот такой код:
using (var site = new SPSite("http://localhost")) { var web = site.RootWeb; var list = web.GetList("Lists/Tasks"); var query = new SPQuery() { ViewFields = "<FieldRef Name='Body' Len='20' MoreText='...'/>", ViewFieldsOnly = true }; foreach (SPListItem item in list.GetItems(query)) { Console.WriteLine(item["Body"]); } }
Дает вот такой результат:
<div>Коллекции на вкладке... <p>Коллекции на вкладке... <div>Коллекции на вкладке...
Фича обнаружена Антоном Вишняковым (@avishnyakov).
Второе место
На втором месте находится простая и очень полезная фича. Если обработчик события элемента списка (event receiver) активировать в фиче уровня Site, то независимо от того к какому типу списка был привязан обработчик он будет срабатывать на каждом списке в коллекции сайтов. В том числе на User Information List хотя в MSDN явно написано что на этот список нельзя повесить обработчик. Таким образом можно отслеживать, например, добавление или удаление групп пользователей.
Возможно аналогичное будет работать и для других типов обработчиков событий.
Фича обнаружена Долгополовым Сергеем (http://www.facebook.com/serg3302).
Первое место
Очень простая и часто используемая фича. При развертывании файлов в виртуальной файловой системе с помощью модулей (Module) для элемента File можно указать атрибут DoGUIDFixUp=”TRUE”. Описание в MSDN крайне аскетично.
Если указать этот атрибут, то внутри самого файла и определения его веб-частей(если создается страница) все выражения вида {$ListId: WebRelativeListUrl;} будут заменяться на Guid_ы списка по указанному Url. Точка с запятой в конце Url обязательна. Естественно на момент развертывания указанный список должен существовать.
Как ни странно этот атрибут, видимо, существует еще с SharePoint 2007 и участвует в сохранении сайта в качестве шаблона. Так как при создании сайта из шаблона ID списков получаются новые, а многие компоненты SharePoint ссылаются на списки по ID. Но найти информацию мне не удалось.
Использование DoGUIDFixUp помогает деплоить workflow, веб-части и страницы с веб-частями.
На сладкое
Если вы используете DataFormWebPart (далее DFWP) для вывода данных с SharePoint помощью XSL и хотите создать веб-часть без серверного кода, то возникает проблема. SPDataSource, который используется для получения данных в DFWP, ищет список на текущем сайте.
Даже если, вы используя DoGUIDFixUp, корректно подставите ID списка на корневом сайте, то при размещении веб-части на дочернем сайте выпадет ошибка.
Оказывается если передать в SPDataSource параметр
<asp:Parameter Name="WebUrl" DefaultValue="{sitecollectionroot}"/>
то SharePoint будет искать список на корневом сайте.
Для примера я сделал проект со списком и веб-частью для отображения на основе DFWP абсолютно без кода.