Получение имен полей элемента списка — (строго типизированных?) в клиентском API SharePoint 2010

#c# #sharepoint #sharepoint-2010 #caml #sharepoint-api

#c# #sharepoint #sharepoint-2010 #caml #sharepoint-api

Вопрос:

Я очень новичок в SharePoint, использую 2010. Пытаюсь понять, что мы можем с этим сделать, в частности, со списками. И у меня такое чувство, что я упускаю что-то довольно очевидное, но не могу его найти…..

На сайте Sharepoint я создал список под названием «Известные люди»: добавил несколько человек, Фрэнка Синатру и т. Д.

  • Фамилия: Синатра
  • Имя: Фрэнк
  • Адрес электронной почты: frank.sinatra@ratpack.com
  • Должность: певец
  • и т. д

Итак, я пытался перенести эту информацию в простое консольное приложение C #, ссылаясь и пробуя множество примеров, которые я нашел. Но я зацикливаюсь на том, какие фактические имена полей (?) Мне нужно ссылаться, поскольку они не выглядят строго типизированными. Но также использование подобных «адресов электронной почты», похоже, тоже не работает

Вот один пример, который я пробовал. (Из: Как: получить элементы списка)

             string siteUrl = "http://servername/site/";
        var clientCtx = new ClientContext(siteUrl);
        Microsoft.SharePoint.Client.List oList = clientCtx.Web.Lists.GetByTitle("Famous People");

        var camlQuery = new CamlQuery {ViewXml = "<View><RowLimit>100</RowLimit></View>"};

        ListItemCollection collListItem = oList.GetItems(camlQuery);

        clientCtx.Load(collListItem,
             items => items.Include(
                item => item.Id,
                item => item.DisplayName,
                item => item.HasUniqueRoleAssignments));

        clientCtx.ExecuteQuery();

        foreach (ListItem oListItem in collListItem)
        {
            Console.WriteLine("ID: {0} nDisplay name: {1} nUnique role assignments: {2}",
                oListItem.Id, oListItem.DisplayName, oListItem.HasUniqueRoleAssignments);
        }

        Console.ReadLine();
        clientCtx.Dispose();
  

Что возвращает:

 ID: 1
Display name: Clough
Unique role assignments: False
ID: 2
Display name: Sinatra
Unique role assignments: False
ID: 3
Display name: Simpson
Unique role assignments: False
ID: 4
Display name: Skywalker
Unique role assignments: False
  

Я попробовал каждый из методов в приведенной выше ссылке на примеры. Но оттуда я понятия не имею, как перейти к другим свойствам, таким как «Задание» или «Адрес электронной почты».
Или, например, если я имею дело со списком, который я не знаю, как мне узнать допустимые имена полей из моего приложения через веб-службу?

Спасибо.

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

1. Получите копию SharePointManager (spm.codeplex.com )

Ответ №1:

Следует помнить, что каждый разделяемый элемент имеет различный набор полей в зависимости от базового типа контента. Это также изменяется в зависимости от того, в каком списке находится элемент. Вот почему в полях нет строго типизированной индексации…

Однако добавление следующего кода должно помочь вам понять, что находится внутри каждого элемента списка

  foreach(SPField field in oListItem.Fields)
 {
     Console.Write(field.Title   " ("   field.InternalName   "): ");
     Console.WriteLine(oListItem[field.Id].ToString());
 }
  

Свойство SPField.SchemaXml показывает полную информацию о конфигурации каждого поля.
Наличие копии SharePointManager даст вам хорошее представление о том, как любой данный сайт взаимодействует друг с другом.

Если вы можете использовать только объектную модель клиента, чтобы обнаружить это

 foreach(string fieldName in oListItem.FieldValues.Keys)
{
     Console.Write(fieldName);
     Console.WriteLine(oListItem.FieldValues[fieldName]);
}
  

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

1. oListItem, похоже, не дает мне oListItem. Поля. Разве это не SPsomething; Например. SPFields; для работы на сервере, а не на клиенте / api?

2. Извините, для этого вам нужно выполнить итерацию filedvalues.keys

Ответ №2:

Вы можете получить доступ к другим свойствам через индексированное свойство на ListItem .

Вы должны добавить свойства, ViewFields относящиеся к ViewXml :

 var camlQuery = new CamlQuery 
{
  ViewXml = "<View><ViewFields><FieldRef Name='Last_x0020_Name'/></ViewFields><RowLimit>100</RowLimit></View>"
};
  

Обратите внимание на _x0020_ кодировку пробелов.

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

1. Похоже, это просто не сработало для меня, если только мне не нужно было добавить что-то еще?

Ответ №3:

Если вы перейдете к настройкам списка, вы можете найти имя столбца, щелкнув по нему. Это отправит вас по ссылке, например: http://servername/_layouts/FldEdit.aspx?List={EACD90E2-ED64-42EE-B1FB-2631687C545F}amp;Field=Title
Имя поля является значением RH для Field=Title . Учитывая, что вы знаете имена столбцов, вы можете использовать следующий код:

 cxt.Load(items,
   c => c.Include(
      item => item["ID"],
      item => item["Title"],
      item => item["AssignedTo"],
      item => item["Status"]));
   cxt.ExecuteQuery();
  

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

1. Вы правы, просмотр этих URL-адресов дает мне имена полей, но не динамически. Это кажется чрезвычайно неряшливым; Мне нужно было что-то, чтобы вернуть имена полей в моем коде из объектной модели API / Client.