A melhor forma de converter uma string campo SharePoint multi-usuário em uma matriz de SPUsers?

StackOverflow https://stackoverflow.com/questions/404024

  •  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!

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top