27 февр. 2012 г.

Сообщения об ошибках

Сообщения об ошибках в SharePoint иногда напоминают вердикты дельфийской пифии: то есть хрен поймёшь, что имелось в виду. Вот почему, например, такой вызов
SPList.GetItemById(-1)
бросает исключение с таким сообщением:
One or more field types are not installed properly. Go to the list settings page to delete these fields.

Где, казалось бы, связь? Но, как и в случае со словами оракула, смысл этого сообщения становится ясен не сразу, в данном случае - после изучения метода GetItemById в декомпиляторе. Оказывается, если переданный идентификатор элемента меньше нуля, то в формируемый CAML-запрос вставляется не поле ID, а поле BdcIdentity, которого в списке нет.

24 февр. 2012 г.

Функция GoToPage

В скриптах SharePoint, в файле init.js, есть глобальная функция GoToPage, принимающая один параметр - адрес страницы. Алгоритм работы этой функции прост: происходит перенаправление на указанный в параметре адрес с добавленным параметром Source. В этот параметр Source записывается текущий адрес, т.е. адрес страницы, с которой происходит перенаправление.
Использовать функцию GoToPage целесообразно для открытия страниц, на которых имеются кнопки для закрытия формы, отмены операции или возврата на предыдущую страницу, ведь в адрес для возврата не нужно вычислять, он уже передан в параметре Source.
Пример:
<a href="javascript:GoToPage('/someFolder/somePage.aspx')">Some page</a>
Для проверки выполните в консоли браузера такой код:
GoToPage(window.location.pathname);

15 февр. 2012 г.

CopyUtil.aspx

В SharePoint существует страница приложения /_layouts/CopyUtil.aspx. Совсем не просто определить её назначение по названию. На самом деле она ничего никуда не копирует, а просто перенаправляет пользователя на форму определённого элемента списка.
Использование её целесообразно при формировании списка ссылок для элементов с разных узлов, например, для отображения результата запроса, сделанного через SPSiteDataQuery.

Рассмотрим, какие параметры следует добавить в адрес страницы CopyUtil.
Если нужный элемент находится на том же узле, на котором будет размещена ссылка, то достаточно добавить параметр InThisWeb=1. В противном случае мы должны как-то указать узел элемента: либо через идентификаторы, либо через адрес. Мы имеем два варианта указания нахождения элемента: по идентификаторам коллекции узлов, узла, списка и самого элемента, или же просто по адресу элемента. В первом случае нужно обязательно добавить параметры Use=id, SiteId, WebId (эти два последних игнорируются, если есть InThisWeb=1), ListId и ItemId. Во втором случае - добавить параметр ItemUrl.
Для того, чтобы открылась форма редактирования элемента, необходимо добавить параметр Action=editform. Чтобы направить пользователя на форму просмотра, добавляем Action=dispform или же вовсе пропускаем параметр Action.
Если добавить параметр Source, то он без изменения будет добавлен в адрес элемента.
Получив необходимые данные, страница CopyUtil откроет, если надо, узел, возьмёт нужный список и адреса его форм, сформирует адрес элемента и выполнит перенаправление с использованием метода SPUtility.Redirect.

Использование этой страницы вместе с публикацией имеет свои особенности и ограничения, про которые можно прочитать здесь: http://blog.mastykarz.nl/copyutilaspx-and-publishing-sites/

Download.aspx

Надо скачать какой-то файл с портала? Авторизовавшись, запрашиваем страницу /_layouts/download.aspx с параметром SourceUrl, в котором указываем адрес нужного файла. В ответ SharePoint вернёт содержимое файла.
Например, я хочу посмотреть, как сделана страница default.aspx, которая была добавлена в корневую папку сайта:
http://site/_layouts/download.aspx?SourceUrl=default.aspx