Обновление значения поля в SharePoint с помощью клиент-объектной модели
Итак, я пытаюсь создать метод, который по существу используется для изменения значения поля в 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 ответов
обновление поля с клиентской объектной моделью довольно прямолинейно:
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 это довольно defferent-вы получаете те же объекты ListItem, но для доступа к связанному файлу вы должны использовать item.File
собственность. Таким образом, ListItem сам будет содержать значения полей,listItem.File
будет содержать файл изображения.
И не забудьте-для доступа к этому файлу вы должны Load()
и затем ExecuteQuery()
.
на 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"];
он использует синтаксис индексатора .NET.
просто помните, что каждое поле имеет внутреннее имя. При запросе индексатора значения поля следует указать внутреннее имя, а не то, которое мы видим в 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]);
}
надеюсь, это поможет кому-то вниз по дороге. Спасибо всем за Ваш вклад!
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();
}