2008-12-31 2 views
9

Piszę program obsługi ItemAdding dla listy programu SharePoint, a lista zawiera pola wielu użytkowników. Ponieważ SPItem nie jest aktualnie dostępny w tym momencie, myślę, że jestem zdegradowany do używania ciągu, który wraca z SPItemEventDataCollection. Że ciąg będzie wyglądać następująco gdy user1, user2 i użytkownik3 występują:Jak najlepiej przekonwertować łańcuch pola SharePoint dla wielu użytkowników na tablicę SPUsers?

1; #MYDOMAIN \ user1; 4; #MYDOMAIN \ użytkownik2; # 10; #MYDOMAIN \ użytkownik3

ja jak przekonwertować to do tablicy obiektów SPUser w celu przekazania go do innej istniejącej metody. Czy jest jakiś wbudowany sposób SharePoint do obsługi tych ciągów, czy jestem spadł do parsowania tego ciągu?

Ponadto, zakładając, że muszę radzić sobie z tym ciągiem znaków, wygląda na to, że tokeny liczb całkowitych zawsze odpowiadają poniższej domenie \ nazwa użytkownika. Czy są przypadki, w których nie będzie to prawda i nie ma żadnej liczby całkowitej lub domeny \ nazwa_użytkownika lub jest ona w inny sposób niepoprawna? Czy bezpiecznie byłoby po prostu użyć liczb i użyć metody SiteUsers.GetByID (id) SPWeb? W garstce testów nie mogę tego zmarnować, ale wydaje się dziwne, że zarówno dane liczbowe, jak i ciągi zostaną uwzględnione, jeśli są całkowicie zbędne.

Dzięki!

+1

I właśnie dlatego nie lubię rozwoju SharePoint ... to tak, jakby ludzie po prostu zapomnieli myśleć *. –

Odpowiedz

16

SPFieldUserValueCollection robi dokładnie to, czego szukasz. Jego konstruktor akceptuje SPWeb i ciąg użytkowników. Elementy SPFieldUserValue w kolekcji zapewniają właściwość User, która zwraca odpowiednie obiekty SPUser dla sieci.

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

Typ SPFieldUser dziedziczy jego zachowanie ze standardowej SPFieldLookup, które również przechowuje zarówno identyfikator i tytule i ma odpowiedni SPFieldLookupValueCollection. Identyfikator obsługuje (słabą) integralność referencyjną, podczas gdy buforowana wartość pozwala na szybkie zapytania.

0

Działa to dla mnie coraz SPSuser z pola użytkownika powinno być to samo dla wydobywania go z danymi zdarzeń .:

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

Liczba całkowita odnosi się do identyfikatora użytkownika w użytkownika lokalnych SPWebs męska Baza danych. Nie jest to jednak zsynchronizowane, więc użytkownik mógł zostać usunięty z bazy danych użytkownika, ponieważ element listy został zapisany.

+0

Dzięki. Zasadniczo skończyłem na tej trasie, ale z dodatkowym zmarszczeniem, że istnieje potencjalnie wielu użytkowników w wartości pola. Dziwne jest to, że z pojedynczym użytkownikiem w moim polu jest tylko wartość liczbowa w polu, a nie "-" wartość rozdzielona. Nadal wydaje się działać. –

Powiązane problemy