понедельник, 4 июня 2012 г.

Пример кастомной web-части MS Sharepoint для работы со списками с использованием Ajax

Пришлось тут мне по работе поразбираться с чудом современного сайтостроения - MS Sharepoint 2010. Пару раз сломал себе голову об стену, пока начал понимать, что там к чему, да и в сети на русском языке качественной информации не так уж и много, поэтому решил написать эту статейку. Если никому не понадобиться, то, по крайней мере, для себя - чтобы не забыть.
Итак, начнем. 

Задача

Создать web-часть, позволяющую добавлять элементы в список и отображать текущее состояние списка, при чем всё это должно происходить через ajax.

Решение

Первым делом, в Sharepoint создаем список с нужным нам именем и полями. В данном примере будем рассматривать список с названием SampleList и единственным полем Title (в русской версии Наименование) - это поле дефолтное, есть во всех создаваемых списках, поэтому создавать его нам самим не нужно.
Далее, в Visual Studio 2010 создаем новый проект с типом Visual Web Part. Далее, в файле VisualWebPart1UserControl.ascx создаем следующую разметку:
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>
        <asp:GridView ID="SampleListView" runat="server">
        </asp:GridView>
        <asp:TextBox ID="NewItemTitle" runat="server"></asp:TextBox><br/>
        <asp:Button ID="uxSubmit" runat="server" onclick="uxSubmit_Submit" Text="Добавить" />
        <asp:Label ID="IbIResult" runat="server" Text="Ajax"></asp:Label>
    <!-- Ajax ends here with -->
    </ContentTemplate>
</asp:UpdatePanel>  
Здесь элемент UpdatePanel указывает границы области, которая будет обновлена при ajax-запросе, элемент SampleListView - таблица, в которую будет выводиться текущее состояние списка, NewItemTitle - текстовое поле, в которое мы будем вводить наименование нового элемента списка, uxSubmit - кнопка сабмита, по нажатию на которую будет отправляться нужный ajax-запрос на сервер, IbIResult - надпись (lable), в которую будем писать результат выполнения запроса.
Теперь переходим к реализации алгоритма обработки всего этого дела. Писать код будем на C#, итак в файле VisualWebPart1UserControl.ascx.cs в класс VisualWebPart1UserControl нужно добавить следующий код:
// Обрабатывает нажатие кнопки "Добавить"
protected void uxSubmit_Submit(object sender, EventArgs e){
    try
    {
 
        // Добавим новый элемент в список
        AddListItem(NewItemTitle.Text);
        // Почистим поле с наименованием
        NewItemTitle.Text = "";
        // Обновим таблицу, отображающую текущее состояние списка
        UpdateSampleListView(); 
        // Выведем результат выполнения операции 
        IbIResult.Text = "Submitted created!";
    }
    catch (Exception ex)
    { 
        // Если словили исключение выведем в результат операции
        // информацию об исключении
        IbIResult.Text = "Task failed" + ex.Message;
    }
}
 
//Обновляет представление списка
private void UpdateSampleListView()
{
    // Получаем из контекста текущий сайт
    SPSite site = SPContext.Current.Site;
    using(SPWeb web = site.OpenWeb())
    {
        // Получим нужный нам список
        SPList SampleList = web.Lists["SampleList"]; 
        // Объявим коллекцию, в которой будем хранить элементы списка
        List<string> SampleListCollection = new List<string>();
        // Пробежим по каждому элементу списка 
        foreach (SPListItem curItem in SampleList.Items)
        { 
            // Добавим значение поля Title текущего элемента списка
            // в коллекцию 
            SampleListCollection.Add(curItem.Title);
        }
 
        // Привяжем источник данных к DataGrid'у 
        SampleListView.DataSource = SampleListCollection; 
        // Выведем в DataGrid всю коллекцию
        SampleListView.DataBind();
    }
}
 
// Добавляет элемент в список
private void AddListItem(string NewItemTitle)
{
    // Получаем из контекста текущий сайт 
    SPSite site = SPContext.Current.Site;
    using (SPWeb web = site.OpenWeb())
    {
        // Получим нужный нам список
        SPList SampleList = web.Lists["SampleList"]; 
        // Создадим новый элемент списка
        SPListItem newItem = SampleList.AddItem(); 
        // Заполним поля нового элемента
        newItem["Title"] = NewItemTitle;
        // Запишем изменения 
        newItem.Update();
    }
}
Вот, собственно, и всё. В коде нет ничего сложного, к тому же, он подробно прокомментирован. Пример, конечно, довольно искусственный, но для того, чтобы понять основные принципы работы со списками, я думаю, его будет достаточно