Как получить UserName из UserInformationListItem в справочнике по службам SharePoint
Я получаю доступ к данным списка SharePoint через WCF и listdata.svc
В одном из моих списков под названием "Задачи" есть поле с именем "AssignedTo". Когда я перебираю элементы списка, поле AssignedTo возвращает UserInformationListItem, а не строковое значение.
Как получить имя пользователя, которому назначено задание? Он должен исходить из UserInformationList, но я не могу понять, как его получить.
Вот мой код:
SpIMDLists.InformationManagementDivisionDataContext dc = new SpIMDLists.InformationManagementDivisionDataContext(new Uri("https://myurl/SiteDirectory/IMD/_vti_bin/ListData.svc/"));
dc.Credentials = System.Net.CredentialCache.DefaultCredentials;
var source = dc.Tasks;
foreach (var task in source)
{
string taskTitle = task.Title;
string taskDesc = task.TaskDescription;
string taskDueDate = task.DueDate.ToString();
string taskStartDate = task.StartDate.ToString();
string taskStatusValue = task.StatusValue;
string taskOutcome = task.TaskOutcome;
string taskAssignedTo ="";
System.Collections.ObjectModel.Collection<SpIMDLists.UserInformationListItem> assignedTo = task.AssignedTo;
}
3 ответа
Если поле AssignedTo является полем Person или Group, оно содержит идентификатор SharePoint пользователя или группы. Например:
<d:AssignedToId m:type="Edm.Int32">8</d:AssignedToId>
В этом случае идентификатор пользователя SharePoint равен 8. Чтобы получить имя пользователя, вам нужно взглянуть на UserInformationList
находится в /_vti_bin/ListData.svc/UserInformationList. Вы можете либо получить всех пользователей в UserInformationList и сохранить его в массиве, либо вы можете найти конкретного пользователя, создав URL-адрес следующим образом (используя ID пользователя 8 из нашего примера): /_vti_bin/ListData.svc/UserInformationList(8)
Если вы хотите увидеть этого пользователя в своем браузере, вы можете сделать это по следующему URL: /_layouts/userdisp.aspx?ID=8
,
Кроме того, вы можете использовать следующую конечную точку для получения той же информации: _vti_bin/ListData.svc/Tasks(1)/AssignedTo
Где 1 в этом примере, это идентификатор задачи. Ваш подход зависит от ваших потребностей.
Дополнительная информация:
ОБНОВЛЕНИЕ: ценим вход. Это привело меня к следующему решению. Так я смог получить имя пользователя. AssignedTo - сложное поле, поэтому мне пришлось использовать Expand для его заполнения. Затем я просто просмотрел коллекцию AssignedTo, чтобы получить пользователя (в этом случае задачи назначаются только 1 пользователю).
Вот мой новый рабочий код:
SpIMDLists.InformationManagementDivisionDataContext dc = new SpIMDLists.InformationManagementDivisionDataContext(new Uri("https://myurl/SiteDirectory/IMD/_vti_bin/ListData.svc/"));
dc.Credentials = System.Net.CredentialCache.DefaultCredentials;
var source = dc.Tasks;
foreach (var task in source.Expand("AssignedTo")
{
string taskTitle = task.Title;
string taskDesc = task.TaskDescription;
string taskDueDate = task.DueDate.ToString();
string taskStartDate = task.StartDate.ToString();
string taskStatusValue = task.StatusValue;
string taskOutcome = task.TaskOutcome;
var assignedTo = task.AssignedTo;
foreach (var usr in assignedTo)
{
string taskAssignedTo = usr.Name;
}
}
Следующий запрос возвращает элемент списка информации о пользователе:
var item = dc.UserInformationList.Where(i => i.Id == <UserId>).FirstOrDefault();
Пример:
var dc = new SiteDataContext(new Uri("http://contoso.intranet.com/_vti_bin/ListData.svc/"));
dc.Credentials = System.Net.CredentialCache.DefaultCredentials;
foreach (var task in dc.Tasks)
{
string taskTitle = task.Title;
var assignedTo = dc.UserInformationList.Where(i => i.Id == task.AssignedToId).FirstOrDefault();
var assignedToName = assignedTo.Name;
}