2008-12-31 12 views
9

Escribo un controlador ItemAdding para una lista de SharePoint, y la lista contiene campos multiusuario. Dado que SPItem no está realmente disponible en este punto, creo que estoy relegado a utilizar la cadena que proviene de SPItemEventDataCollection. Esa cadena se verá algo como esto cuando usuario1, usuario2 y usuario3 están presentes:¿Cuál es la mejor manera de convertir una cadena de campo multiusuario de SharePoint en una matriz de SPUsers?

1; #MYDOMAIN \ usuario1; # 4; #MYDOMAIN \ usuario2; # 10; #MYDOMAIN \ User3

que había Me gusta convertir esto en una matriz de objetos SPUser para pasarlo a otro método existente. ¿Hay alguna forma integrada de SharePoint para manejar estas cadenas, o estoy relegado a analizar esta cadena?

Además, suponiendo que tenga que tratar con esta cadena, parece que los tokens enteros aquí siempre corresponden al dominio \ nombre de usuario que sigue. ¿Hay algún caso en que esto no sea cierto y el entero o el dominio \ nombre de usuario falten o sean incorrectos? ¿Sería seguro usar los números y usar el método SiteUsers.GetByID (id) de SPWeb? En un puñado de pruebas no puedo conseguir que falle, pero parece extraño que los datos numéricos y de cadena se incluirían si son totalmente redundantes.

Gracias!

+1

Y esta es la razón por la que no me gusta el desarrollo de SharePoint ... es como que la gente simplemente * se olvidó de pensar *. –

Respuesta

16

SPFieldUserValueCollection hace exactamente lo que estás buscando. Su constructor acepta un SPWeb y una cadena de usuarios. Los elementos SPFieldUserValue en la colección proporcionan una propiedad de usuario que devuelve los objetos de SPUser correspondientes para la 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 
    } 
} 

El tipo SPFieldUser hereda su comportamiento de la norma SPFieldLookup, que también almacena tanto ID y el título y tiene un SPFieldLookupValueCollection correspondiente. El ID admite integridad referencial (débil) mientras que el valor en caché permite consultas rápidas.

0

Esto funciona para mí conseguir un SPSuser de un campo de usuario Debe ser lo mismo para extraerlo de datos 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; 
     } 

El entero se refiere a la identificación del usuario en usuario de los SPWebs locales base de datos. Sin embargo, esto no está sincronizado, por lo que el usuario puede haber sido eliminado de la base de datos del usuario desde que se guardó el elemento de la lista.

+0

Gracias. Básicamente terminé tomando esta ruta, pero con la arruga añadida de que hay potencialmente múltiples usuarios en el valor del campo. Una cosa rara es que con un solo usuario en mi campo, solo existe el valor numérico en el campo en lugar del valor delimitado por ";". Todavía parece funcionar. –

Cuestiones relacionadas