A melhor forma de converter uma string campo SharePoint multi-usuário em uma matriz de SPUsers?
-
03-07-2019 - |
Pergunta
Eu estou escrevendo um manipulador ItemAdding para uma lista SharePoint, ea lista contém campos multi-usuário. Desde o SPItem não está realmente disponível neste momento, eu acho que estou relegado para utilizar a cadeia que volta do SPItemEventDataCollection. Essa seqüência será algo parecido com isso quando Usuário1, user2 e user3 estão presentes:
1; #MYDOMAIN \ user1; # 4; #MYDOMAIN \ user2; # 10; #MYDOMAIN \ user3
Eu gostaria de converter isso em um array de objetos SPUser, a fim de passá-lo para outro método existente. Existe alguma SharePoint built-in maneira de lidar com essas cadeias, ou estou relegado para analisar essa string?
Além disso, supondo que eu preciso para lidar com esta corda, parece que o número inteiro fichas aqui sempre correspondem ao domínio \ nome do usuário que se segue. Existem quaisquer casos em que isso não será verdade e quer o inteiro ou o domínio \ nome do usuário estão faltando ou de outra forma incorreta? Seria seguro usar apenas os números e use o método de SPWeb SiteUsers.GetByID (id)? Em um punhado de testes que eu não consigo que a falhar, mas parece estranho que tanto os dados numéricos e cordas seriam incluídos se eles estão totalmente redundante.
Obrigado!
Solução
SPFieldUserValueCollection faz exatamente o que você está procurando. Seu construtor aceita um SPWeb e seqüência de usuários. Os itens SPFieldUserValue na coleção fornecem uma propriedade de usuário que retorna a SPUser correspondente objetos para a web.
private void ProcessUsers(SPListItem item, string fieldName)
{
string fieldValue = item[fieldName] as string;
SPFieldUserValueCollection users = new SPFieldUserValueCollection(item.Web, fieldValue);
foreach(SPFieldUserValue uv in users)
{
SPUser user = uv.User;
// Process user
}
}
O tipo SPFieldUser herda seu comportamento a partir do SPFieldLookup padrão, que também armazena tanto ID e Título e tem uma SPFieldLookupValueCollection correspondente. Os suportes de identificação (fracos) de integridade referencial, enquanto o valor em cache permite para consultas rápidas.
Outras dicas
Isso funciona para mim recebendo uma SPSuser de um campo de usuário Deve ser a mesma coisa para extraí-lo a partir de dados de eventos:.
private SPUser getGroup(SPListItem item, string fieldName)
{
string fieldValue = item[fieldName] as string;
if (string.IsNullOrEmpty(fieldValue)) return null;
int id = int.Parse(fieldValue.Split(';')[0]);
SPUser user = item.Web.AllUsers.GetByID(id);
return user;
}
O inteiro refere-se à ID do usuário no banco de dados do usuário do SPWebs locais. Esta é, no entanto não sincronizada, para que o usuário pode ter sido excluído do banco de dados do usuário uma vez que o item da lista foi salva.