2010-08-01 2 views
11

Ich verwende verwaltete Client-Seite Objektmodell in Sharepoint 2010. Und ich möchte loginaName der AssignedTo Benutzer in Aufgabenliste.Wie erhält man ein Sharepoint-Benutzerobjekt aus dem "AssignedTo" -Feld mit dem clientseitigen Objektmodell?

Im serverseitigen Objektmodell verwende ich SPFieldUserValue.User.LoginName, um diese Eigenschaft abzurufen, aber im clientseitigen Objektmodell ist FieldUserValue.User nicht vorhanden.

Wie kann ich diese Situation beheben?

Dank

Antwort

3

Sie erhalten die Spalte, die als FieldUserValue aus der Liste, sobald Sie, dass Sie die Lookup-ID-Wert verwenden und dann Abfrage der Seiten User Info-Liste. Im folgenden Beispiel cache ich die Ergebnisse, um zu verhindern, dass dieselbe ID mehr als einmal nachgeschlagen wird, da die Abfrage teuer sein kann.

private readonly Dictionary<int, string> userNameCache = new Dictionary<int, string>(); 
public string GetUserName(object user) 
{ 
     if (user == null) 
     { 
      return string.Empty; 
     } 

     var username = string.Empty; 
     var spUser = user as FieldUserValue;    
     if (spUser != null) 
     { 
      if (!userNameCache.TryGetValue(spUser.LookupId, out username)) 
      { 
       var userInfoList = context.Web.SiteUserInfoList; 
       context.Load(userInfoList); 
       var query = new CamlQuery { ViewXml = "<View Scope='RecursiveAll'><Query><Where><Eq><FieldRef Name='ID' /><Value Type='int'>" + spUser.LookupId + "</Value></Eq></Where></Query></View>" }; 
       var users = userInfoList.GetItems(query); 
       context.Load(users, items => items.Include(
        item => item.Id, 
        item => item["Name"])); 
       if (context.TryExecuteQuery()) 
       { 
        var principal = users.GetById(spUser.LookupId); 
        context.Load(principal); 
        context.ExecuteQuery() 
        username = principal["Name"] as string; 
        userNameCache.Add(spUser.LookupId, username); 
       } 
      } 
     } 
     return username; 
    } 
12

Hier ist der Code dafür. Ich habe ein Beispiel für AssignedTo-Feld aus Aufgabenliste genommen. Ich hoffe das hilft.

public static User GetUserFromAssignedToField(string siteUrl) 
    { 
     // create site context 
     ClientContext ctx = new ClientContext(siteUrl); 

     // create web object 
     Web web = ctx.Web; 
     ctx.Load(web); 

     // get Tasks list 
     List list = ctx.Web.Lists.GetByTitle("Tasks"); 
     ctx.Load(list); 

     // get list item using Id e.g. updating first item in the list 
     ListItem targetListItem = list.GetItemById(1); 

     // Load only the assigned to field from the list item 
     ctx.Load(targetListItem, 
         item => item["AssignedTo"]); 
     ctx.ExecuteQuery(); 

     // create and cast the FieldUserValue from the value 
     FieldUserValue fuv = (FieldUserValue)targetListItem["AssignedTo"]; 

     Console.WriteLine("Request succeeded. \n\n"); 
     Console.WriteLine("Retrieved user Id is: {0}", fuv.LookupId); 
     Console.WriteLine("Retrieved login name is: {0}", fuv.LookupValue); 

     User user = ctx.Web.EnsureUser(fuv.LookupValue); 
     ctx.Load(user); 
     ctx.ExecuteQuery(); 

     return user; 
    } 
+0

mit ctx.Web.EnsureUser arbeitete wie ein Charme ... – onzur

+6

LOOKUPVALUE gibt mir Namen angezeigt werden und nicht Login-Namen. –

1

Alles oben für mich gearbeitet, aber statt:

FieldUserValue fuv = (FieldUserValue)targetListItem["AssignedTo"];

I verwendet:

FieldUserValue[] fuv = targetListItem["AssignedTo"] as FieldUserValue[];

5

Die fuv.LookupValue die Anzeigenamen enthalten kann, nicht der Login-Name , so mein Vorschlag ist (vorausgesetzt, Sie haben die FieldUserValue - fuv i n-Code (wie durch @ekhanna descibed):

var userId = fuv.LookupId; 
var user = ctx.Web.GetUserById(userId); 

ctx.Load(user); 
ctx.ExecuteQuery(); 
+0

Sorry, das funktioniert nicht: 'Microsoft.SharePoint.Client.ServerException aufgetreten/Der angegebene Benutzer 5651 konnte nicht gefunden werden. – PeterX

+0

Das bedeutet, dass es keinen Benutzer mit dieser ID gibt. Stellen Sie sicher, dass Sie die ID des Benutzers und NICHT den Index des Benutzers in der SiteUsers-Auflistung verwenden. – pholpar

+0

Arbeitet noch heute! Guter Ruf. –

Verwandte Themen