Доступ к свойствам SPLIstItem в SharePoint - PullRequest
2 голосов
/ 15 марта 2009

Я пытаюсь сделать что-то очень простое - получить доступ к элементам моего списка SharePoint и их свойствам.

Однако значение SPListItem.Properties равно нулю для всех обычных списков. Все работает, как и ожидалось, для библиотек документов и страниц. Итак, если элементы списка основаны на типе документа, все хорошо. Если они основаны на элементе, свойства не возвращаются.

Я пробовал в двух средах: новые сайты создавались из шаблонов публикации OOTB, с новыми списками, основанными на типах контента OOTB и т. Д. Всегда одно и то же.

Правильное количество SPListItems всегда возвращается. Название и имя в порядке. Просто хеш-таблица .Properties совершенно пуста.

В отчаянии я написал веб-часть, которая выводит следующую (некрасивую!) Диагностику.

    foreach (SPList list in SPContext.Current.Web.Lists)
    {
        foreach (SPListItem item in list.Items)
        {
            Label label = new Label();
            label.Text = "Name: " + item.Name + "Property count: " + item.Properties.Count;
            this.Controls.Add(label);
        }
    }

Единственное наблюдение состоит в том, что он работает именно так, как я описал ранее. Я просто делюсь кодом, чтобы показать, что это самая простая операция из всех возможных.

Вот пример вывода - я добавил разрывы строк для удобства чтения; -)

Name: Test Property count: 0
Name: default.aspx Property count: 21 

Очевидно, что элемент «Тест» - это элемент списка на основе элементов, а default.aspx - это страница.

Кто-нибудь сталкивался с чем-нибудь подобным? Есть идеи?

Ответы [ 7 ]

4 голосов
/ 16 марта 2009

item ["FieldName"] - это канонический способ получения значения столбца метаданных в списке SharePoint. Если вам нужно получить список доступных полей для списка SharePoint, проверьте свойство Fields родительского объекта SPList, которое является коллекцией полей в этом списке. Каждый из этих объектов поля будет иметь свойство с именем InternalName, и это то, что вы должны использовать для доступа к его значению при работе с экземпляром SPListItem.

3 голосов
/ 15 марта 2009

Вы пытаетесь получить значение поля? К сожалению, они не сильно напечатаны:

string ModifiedBy = (string)item["Author"];

Чтобы получить правильные имена полей (они должны быть внутренними именами), перейдите в Список и затем Настройки списка. Вы найдете список столбцов там. Нажмите на любое имя столбца, чтобы перейти на страницу редактирования, а затем посмотрите URL-адрес в адресной строке браузера. В самом конце должен быть параметр «Поле = Редактор» или аналогичный - это ваше внутреннее имя поля.

Если вам интересно, почему поле типа «Тестовое поле» выглядит странно, то есть потому, что Sharepoint кодирует определенные символы. Пробел будет закодирован в x0020 , следовательно, внутреннее имя для "Test Field" - "Test_x0020_Field".

Чтобы получить правильный тип поля для приведения к:

string FieldType = item["Author"].GetType().FullName;

(Промежуточное окно в Visual Studio чрезвычайно полезно для этого!)

1 голос
/ 23 декабря 2014

Я нашел следующее расширение класса SPListItem очень полезным.

internal static class SharePointExtensions
{
    internal static Dictionary<string, object> PropertiesToDictionary(this SPListItem item)
    {
        // NOTE: This code might be temping - but don't do it! ...itdoes not work as there are often multiple field definitions with the same Title!
        // return item.Fields.Cast<SPField>().ToDictionary(fld => fld.Title, fld => item[fld.Title]);

        Dictionary<string, object> dict = new Dictionary<string, object>();
        var fieldNames = item.Fields.Cast<SPField>().Select(fld => fld.Title).Distinct().OrderBy(sz => sz).ToArray();
        foreach (fieldName in fieldNames)
            dict.Add(sz, item[fieldName]);
        return dict;
    }
}

с ним вы можете просто сделать:

item.PropertiesToDictionary()

... и у вас будет хороший словарный объект Linq, который будет работать так, как вы ожидаете. Это немного тяжелый вес / низкая производительность? Конечно. Готовы ли большинство людей пойти на этот компромисс? Я так думаю ...

0 голосов
/ 31 мая 2014
 SPList yourList = web.Lists["Your list name"];
 string sColumnValue = oSPListItem[yourList.Fields["yourSiteColumn display   
  name"].InternalName].ToString();
0 голосов
/ 14 января 2014

Хеш-таблица ListItem.Properties будет пустой, если вы не назначите ее.

 SPListItem item = properties.ListItem;
 item.Properties["Key"] = "value";

 int total = item.Properties.Count;

Ответ: "всего == 1"

0 голосов
/ 16 марта 2009

Если вы хотите получить объект из SPField объекта SPListItem, вам нужно сделать так:

SPField field = ((SPList)list).Fields.GetField("FieldName"); 
object fieldValue = field.GetFieldValue(((SPListItem)item)[field.Title].ToString());
0 голосов
/ 15 марта 2009

Запускаете ли вы SPListItem.Update () или .SystemUpdate () после установки свойств?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...