вторник, 14 декабря 2010 г.

Sharepoint: SPContext

При разработке в Sharepoint у нас есть один помощник SPContext - это класс, в котором содержится информация о текущем контексте выполнения кода. Этот класс содержит ряд членов, анализ которых нам может сказать многое. Сам SPContext работает только в рамках портала, т.е. в обработчиках, веб-частях и других элементах, в которых по идеи этот контекст применим. Но этот класс не работает, например, в различных консольных приложениях, т.к. не понятно о каком контексте выполнения может идти речь. Это можно проверить, проанализировав член SPContex.Current. Если программа выполняется вне контекста элементов Sharepoint, то это член равен null.
Что полезного можно вытащить из него? Допустим у нас есть веб-часть, расположенная на какой-нибудь странице портала. Что мы можем увидеть?


  • SPContex.Current.List != null, если веб-часть расположена в контексте списка, т.е. на любом представлении списка или на страницах New/Disp/EditForm.aspx.
  • SPContex.Current.Item != null, если веб-часть расположена в контексте элемента списка, т.е. на страницах New/Disp/EditForm.aspx или им подобным. Но если веб-часть будет расположена на странице представления, то SPContex.Current.List == null
  •  SPContex.Current.Web - получим текущий сайт и все связанные с ним объекты: списки, элементы списков (через соответствующий доступ) и тд.
  • и тд.
Как видно, SPContex дает нам много информации для анализа.
А теперь о возможной ошибке, на которую можно натолкнуться. В Sharepoint есть такое понятие как запуск кода под повышенными правами, используя SPSecurity.RunWithElevatedPrivileges. Это поможет, например, нам сделать запись в список под текущим пользователем, если у пользователя нет прав на запись в этот список. Очень частая ошибка возникает, когда пытаются использовать объект SPWeb взятый под повышенными правами из SPContext. Вопреки ожиданиям мы не получим SPWeb под пользователем с повышенными правами. В SPWeb будет храниться сайт и все объекты текущего, зайденного на портал, пользователя. Поэтому при попытке записи в список, на который нет прав у текущего пользователя, будет выброшено исключение нарушения доступа. Поэтому нужно заново открывать объект SPWeb и использовать его (как одна из вариаций кода):
SPSecurity.RunWithElevatedPrivileges(delegate()
{
    using (SPSite site = new SPSite(SPContext.Current.Site.ID))
    {
        using (SPWeb web = site.OpenWeb(SPContext.Current.Web.ID))
        {
            list = web.Site.RootWeb.Lists["News"];
        }
    }
});

Комментариев нет:

Отправить комментарий

Еще статьи

2leep.com