Доступ к ресурсам, прикрепленным к элементам списка в SharePoint - PullRequest
0 голосов
/ 25 февраля 2020

Я получаю доступ к списку элементов календаря на сайте SharePoint2013 следующим образом:

    public ListItemCollection GetListByTitle(string title)
    {
        ClientContext context = new ClientContext(_site);
        List list = context.Web.Lists.GetByTitle(title);
        ListItemCollection listItems = list.GetItems(new CamlQuery()); // Empty CamlQuery to return all items in list
        context.Load(listItems);
        context.ExecuteQuery();
        return listItems;
    }

Затем я передаю эту ListItemCollection другому методу, который сопоставит некоторые свойства элемента с пользовательской моделью.

    public List<CustomModel>GetListOfCustomModel(ListItemCollection listItems)
    {
        List<CustomModel> customModelList = new List<CustomModel>();
        foreach(ListItem i in listItems)
        {
            FieldUserValue contact = (FieldUserValue)i.FieldValues["Contact"];
            string s = (string)(contact.LookupValue);
            string t = (string)i.FieldValues["Title"];
            DateTime start = (DateTime)i.FieldValues["EventDate"];
            // etc.
        }
    }

Все «встроенные» свойства легко получить, но я не могу понять, как получить доступ к ресурсам, которые компания создала и прикрепила к этим элементам.

Например, к каждому элементу календаря прикреплен ресурс "Комната". Я понимаю, что это "метаданные", но, конечно, я должен иметь к ним доступ как-нибудь? Это должно быть связано с предметом, который я просто не знаю, где искать. Когда я делаю представление списка SharePoint для каждого столбца в списке, я вижу, что ресурс "комната" генерируется как ссылка со ссылкой на ресурс.

Или я собираюсь в конечном итоге просмотреть текстовый ответ от просматривая мою страницу LISTALL в веб-запросе и анализируя комнату, используя старые добрые манипуляции со строками?!

1 Ответ

0 голосов
/ 25 февраля 2020

Я смотрел на это в течение нескольких дней, и я нашел кусок кода, который переводит ListItemCollection в DataTable

Этот код обрабатывается Microsoft.SharePoint.Client.FieldLookupValue, Microsoft.SharePoint.Client.FieldUserValue и Microsoft.SharePoint.Client.FieldUserValue[] но когда я смотрел свой вывод в Excel, я увидел Microsoft.SharePoint.Client.FieldLookupValue[]

Снова отладил код и углубился в этот экземпляр FieldLookupValue[] с именем Facilities, который, о чудо, там есть комната и все остальные «Ресурсы».

КРАТКИЙ ОТВЕТ: Не ищите ресурсы, ищите СРЕДСТВА

Вот код, который я взял из другого отвечайте на сайт, который просматривает ListItemCollection и переносит информацию в DataTable, но с поправками, отображающими Id, а также value для массивов FieldUserValue и, что более важно, делают то же самое для FieldLookupValue массивов:

    public DataTable GetDataTableFromListItemCollection(ListItemCollection listItems)
    {
        DataTable dt = new DataTable();
        foreach (var field in listItems[0].FieldValues.Keys)
        {
            dt.Columns.Add(field);
        }

        foreach (var item in listItems)
        {
            DataRow dr = dt.NewRow();

            foreach (var obj in item.FieldValues)
            {
                if (obj.Value != null)
                {
                    string key = obj.Key;
                    string type = obj.Value.GetType().FullName;

                    if (type == "Microsoft.SharePoint.Client.FieldLookupValue")
                    {
                        dr[obj.Key] = ((FieldLookupValue)obj.Value).LookupValue;
                    }
                    else if (type == "Microsoft.SharePoint.Client.FieldUserValue")
                    {
                        dr[obj.Key] = ((FieldUserValue)obj.Value).LookupValue;
                    }
                    else if (type == "Microsoft.SharePoint.Client.FieldUserValue[]")
                    {
                        FieldUserValue[] multValue = (FieldUserValue[])obj.Value;
                        foreach (FieldUserValue fieldUserValue in multValue)
                        {
                            dr[obj.Key] += "&" + fieldUserValue.LookupId + "=" + fieldUserValue.LookupValue;
                        }
                    }
                    else if (type == "Microsoft.SharePoint.Client.FieldLookupValue[]")
                    {
                        FieldLookupValue[] multValue = (FieldLookupValue[])obj.Value;
                        foreach (FieldLookupValue fieldLookupValue in multValue)
                        {
                            dr[obj.Key] += "&" + fieldLookupValue.LookupId + "=" + fieldLookupValue.LookupValue;
                        }
                    }
                    else if (type == "System.DateTime")
                    {
                        if (obj.Value.ToString().Length > 0)
                        {
                            var date = obj.Value.ToString().Split(' ');
                            if (date[0].Length > 0)
                            {
                                dr[obj.Key] = date[0];
                            }
                        }
                    }
                    else
                    {
                        dr[obj.Key] = obj.Value;
                    }
                }
                else
                {
                    dr[obj.Key] = null;
                }
            }
            dt.Rows.Add(dr);
        }

        return dt;
    }

https://social.technet.microsoft.com/Forums/en-US/4bf89ee1-50a1-4c21-9ef9-51bd4d2ae155/convert-listitemcollection-to-datatable-without-looping-through-all-list-items-using-csom?forum=SP2016

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