Qual è il modo migliore per convertire una stringa di campo multiutente di SharePoint in una matrice di SPUser?

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

  •  03-07-2019
  •  | 
  •  

Domanda

Sto scrivendo un gestore ItemAdding per un elenco di SharePoint e l'elenco contiene campi multiutente. Poiché SPItem non è effettivamente disponibile a questo punto, penso di essere retrocesso a utilizzare la stringa che ritorna da SPItemEventDataCollection. Quella stringa avrà un aspetto simile quando sono presenti user1, user2 e user3:

1; #MYDOMAIN \ user1; # 4; #MYDOMAIN \ user2; # 10; #MYDOMAIN \ user3

Vorrei convertirlo in un array di oggetti SPUser per passarlo in un altro metodo esistente. Esiste un modo incorporato di SharePoint per gestire queste stringhe o sono relegato a analizzare questa stringa?

Inoltre, supponendo che debba gestire questa stringa, sembra che i token interi qui corrispondano sempre al dominio \ nomeutente che segue. Ci sono casi in cui ciò non sarà vero e che mancano o sono integer o integer o domain \ username o comunque errato? Sarebbe sicuro usare solo i numeri e utilizzare il metodo SiteUsers.GetByID (id) di SPWeb? In una manciata di test non riesco a farlo fallire, ma sembra strano che sia i dati numerici che quelli di stringa sarebbero inclusi se fossero totalmente ridondanti.

Grazie!

È stato utile?

Soluzione

SPFieldUserValueCollection fa esattamente quello che stai cercando. Il suo costruttore accetta un SPWeb e una stringa di utenti. Gli elementi SPFieldUserValue nella raccolta forniscono una proprietà Utente che restituisce gli oggetti SPUser corrispondenti per il 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
  }
}

Il tipo SPFieldUser eredita il suo comportamento dallo standard SPFieldLookup, che memorizza anche ID e titolo e ha un corrispondente SPFieldLookupValueCollection. L'ID supporta l'integrità referenziale (debole) mentre il valore memorizzato nella cache consente query rapide.

Altri suggerimenti

Questo funziona per me ottenere un SPSuser da un campo utente Dovrebbe essere la stessa cosa per estrarlo dai dati dell'evento .:

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;
        }

Il numero intero si riferisce all'ID dell'utente nel database utenti di SPWebs locale. Questo, tuttavia, non è sincronizzato, quindi l'utente potrebbe essere stato eliminato dal database dell'utente da quando è stato salvato l'elemento dell'elenco.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top