2010-08-01 21 views
11

Estoy usando el modelo de objetos del lado del cliente administrado en Sharepoint 2010. Y quiero obtener loginaName del Asignado al usuario en la lista de tareas.¿Cómo obtener el objeto Usuario Sharepoint del campo "Asignado a" utilizando el modelo de objetos del lado del cliente?

En el modelo de objeto del lado del servidor, utilizo SPFieldUserValue.User.LoginName para obtener esta propiedad, pero en el modelo de objetos del lado del cliente FieldUserValue.User no existe.

¿Cómo puedo resolver esta situación?

Gracias

Respuesta

3

Se obtiene la columna que como el FieldUserValue de la lista, una vez que tenga que utilice el valor de búsqueda Identificación y consulta en la lista sitios de información del usuario. En el ejemplo siguiente, guardo en caché los resultados para evitar buscar el mismo ID más de una vez, ya que la consulta puede ser costosa.

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

Aquí está el código para eso. He tomado un ejemplo del campo AssignedTo de la lista de tareas. Espero que eso ayude.

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

usando ctx.Web.EnsureUser trabajó como un encanto ... – onzur

+6

LookupValue me da visualización del nombre y no nombre de usuario. –

1

Todo lo anteriormente trabajó para mí, pero en lugar de:

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

utilicé:

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

5

El fuv.LookupValue puede contener el nombre para mostrar, no el nombre de inicio de sesión , por lo que mi sugerencia es (suponiendo que tenga el FieldUserValue - fuv i código n (según lo expuesto por @ekhanna):

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

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

Lo sentimos, esto no funciona: 'Microsoft.SharePoint.Client.ServerException ocurrió/El usuario especificado 5651 no se pudo encontrar. – PeterX

+0

Eso significa que no hay ningún usuario con este ID. Asegúrese de utilizar la ID del usuario y NO el índice del usuario en la colección de SiteUsers. – pholpar

+0

¡Todavía trabajando hoy! Buena llamada. –

Cuestiones relacionadas