Обновление значения поля в SharePoint с использованием клиент-объектной модели - PullRequest
7 голосов
/ 04 августа 2011

Итак, я пытаюсь создать метод, который по сути используется для изменения значения поля в SharePoint.

Это то, что у меня есть ...

static String fieldName1 = "Title";
static String fieldName2 = "Keywords";
static String title = "A Beautiful Sunset";
static String keywords1 = "test1";
static String keywords2 = "test2";
static String keywords3 = "test3";

static NetworkCredential credentials = new NetworkCredential(username, password, domain);
static ClientContext clientContext = new ClientContext(URL);
static Web site = clientContext.Web;
static List list = site.Lists.GetByTitle(listName);
static FileCreationInformation newFile = new FileCreationInformation();

private static void updateFields()
{
    clientContext.Load(list);
    FieldCollection fields = list.Fields;
    clientContext.Load(fields);
    clientContext.Load(list.RootFolder);

    ListItemCollection listItems = list.GetItems(CamlQuery.CreateAllItemsQuery());
    clientContext.Load(listItems);
    clientContext.ExecuteQuery();

    foreach (var listItem in listItems)
    {
        Console.WriteLine("Id: {0} Title: {1}", listItem.Id, listItem["Title"]);
        clientContext.Load(listItem.File);
        clientContext.ExecuteQuery();
        Console.WriteLine("listItem File Name: {0}", listItem.File.Name);

        if (listItem.File.Name.Contains("Sunset"))
        {
            ////????????
        }
        listItem.Update();
    }
    clientContext.ExectueQuery();
}

Я знаю, как добраться до поля, но я не уверен, как получить доступ к фактическому значению в поле и изменить его.У кого-нибудь есть опыт использования этой модели клиент-объект?Спасибо за любую помощь, которая предлагается!

Ответы [ 4 ]

15 голосов
/ 05 августа 2011

Обновление поля с помощью клиентской объектной модели довольно просто:

ClientContext ctx = new ClientContext("http://yoursite");
List list = ctx.Web.Lists.GetByTitle("ListName");
ListItemCollection items = list.GetItems(CamlQuery.CreateAllItemsQuery());
ctx.Load(items); // loading all the fields
ctx.ExecuteQuery();

foreach(var item in items)
{
    // important thing is, that here you must have the right type
    // i.e. item["Modified"] is DateTime
    item["fieldName"] = newValue;

    // do whatever changes you want

    item.Update(); // important, rembeber changes
}
ctx.ExecuteQuery(); // important, commit changes to the server

С DocumentLibrary это довольно важно - вы получаете те же объекты ListItem, но для доступа к связанному файлу вы должны использовать item.File имущество.Таким образом, сам ListItem будет содержать значения полей, listItem.File будет содержать файл, скажем, изображение.
И не забывайте - для доступа к этому файлу необходимо Load() его, а затем ExecuteQuery().

3 голосов
/ 06 августа 2014

Просто помните, что каждое поле имеет внутреннее имя. Когда вы запрашиваете значение поля с помощью индексатора, вы должны дать ему внутреннее имя, а не то, которое мы видим в SharePoint Online.

Например, вы добавляете столбец с именем Phone. Вы должны запросить значение следующим образом:

//query the internal name of the "Phone" field
Field field = list.Fields.GetByInternalNameOrTitle("Phone");
context.Load(field);
context.ExecuteQuery();

//load items
var items = list.GetItems(new CamlQuery());
context.Load(items);
context.ExecuteQuery();

foreach (var item in items)
{
   //here we use the internal name
   Console.WriteLine("\t field, phone:{0}", item[field.InternalName]);
}
1 голос
/ 04 августа 2011

FieldCollection описывает схему элементов списка .Вам нужно загрузить фактические элементы списка , чтобы получить доступ к их значениям!

Ознакомьтесь с этим подробным пошаговым руководством по MSDN для получения дополнительной информации о SharePoint и объектной модели клиента: http://msdn.microsoft.com/en-us/library/ee857094.aspx#SP2010ClientOM_The_Managed_Client_Object_Model

Таким образом, в этом случае следующий пример кода с вышеприведенной страницы MSDN иллюстрирует это:

using System;
using Microsoft.SharePoint.Client;

class Program
{
    static void Main()
    {
        ClientContext clientContext = new ClientContext("http://intranet.contoso.com");
        List list = clientContext.Web.Lists.GetByTitle("Announcements");
        CamlQuery camlQuery = new CamlQuery();
        camlQuery.ViewXml = "<View/>";
        ListItemCollection listItems = list.GetItems(camlQuery);
        clientContext.Load(list);clientContext.Load(listItems);
        clientContext.ExecuteQuery();
        foreach (ListItem listItem in listItems)
            Console.WriteLine("Id: {0} Title: {1}", listItem.Id, oListItem["Title"]);
    }
}

В частности, значение поданного элемента списка получается следующим образом:

string itemTitle = oListItem["Title"];

Itиспользует синтаксис .NET indexer.

0 голосов
/ 05 августа 2011

Надеюсь, это поможет кому-то в будущем.Спасибо всем за ваш вклад!

private static void updateFields()
        {
            //Loads the site list
            clientContext.Load(list);
            //Creates a ListItemCollection object from list
            ListItemCollection listItems = list.GetItems(CamlQuery.CreateAllItemsQuery());
            //Loads the listItems
            clientContext.Load(listItems);
            //Executes the previous queries on the server
            clientContext.ExecuteQuery();

            //For each listItem...
            foreach (var listItem in listItems)
            {
                //Writes out the item ID and Title
                Console.WriteLine("Id: {0} Title: {1}", listItem.Id, listItem["Title"]);
                //Loads the files from the listItem
                clientContext.Load(listItem.File);
                //Executes the previous query
                clientContext.ExecuteQuery();
                //Writes out the listItem File Name
                Console.WriteLine("listItem File Name: {0}", listItem.File.Name);

                //Looks for the most recently uploaded file, if found...
                if (listItem.File.Name.Contains("Sunset"))
                {
                    //Changes the Title field value
                    listItem["Title"] = title;
                    //Changes the Keywords field value
                    listItem["Keywords"] = keywords1 + keywords2 + keywords3;
                    //Writes out the item ID, Title, and Keywords
                    Console.WriteLine("Id: {0} Title: {1} Keywords: {2}", listItem.Id, listItem["Title"], listItem["Keywords"]);
                }
                //Remember changes...
                listItem.Update();
            }
            //Executes the previous query and ensures changes are committed to the server
            clientContext.ExecuteQuery();
        }
...