2012-07-12 12 views
5

Estoy intentando actualizar el campo "ModifiedBy" en un panel de debate de Sharepoint utilizando el Modelo de objetos del cliente. Al cambiar los campos "Editor" y "Autor", puedo cambiar el "ModifiedBy" que aparece en la vista de lista. Sin embargo, una vez que haga clic en una publicación de discusión, el campo "Modificado Por" que aparece allí (el que tiene la imagen de arriba) no refleja los cambios. Después de experimentar, descubrí que el campo que necesito cambiar para corregir esto se llama "MyEditor". Desafortunadamente, este campo es de solo lectura.Configuración del modelo de objetos de Sharepoint Client Campo ModifiedBy

En el siguiente código, intento cambiar la configuración de solo lectura del campo a falso. Cuando miro el campo MyEditor en el depurador de Visual Studio después de la línea ExecuteQuery() en la parte inferior del primer bloque, muestra que el valor de ReadOnlyField de hecho se ha establecido en falso.

 sharepointContext.Load(discussionList); 
     sharepointContext.ExecuteQuery(); 
     var fields = discussionList.Fields; 
     sharepointContext.Load(fields); 
     sharepointContext.ExecuteQuery(); 
     var field = fields.GetByInternalNameOrTitle("MyEditor"); 
     field.ReadOnlyField = false; 
     field.Update(); 
     sharepointContext.Load(field); 
     sharepointContext.ExecuteQuery(); 

El código anterior se ejecuta sin problemas. El problema viene con este bloque siguiente:

 //...Code to initialize discussionItem... 
     discussionItem["MyEditor"] = 0; 
     discussionItem["Editor"] = 0; 
     discussionItem["Author"] = 0; 
     discussionItem["Body"] = "Testing"; 
     discussionItem["Title"] = "Hello Worlds"; 
     discussionItem.Update(); 
     sharepointContext.Load(discussionItem); 
     sharepointContext.ExecuteQuery(); 

Cuando el código alcanza executeQuery() en la parte inferior del segundo bloque, que arroja un ServerException con el siguiente mensaje:

 Invalid data has been used to update the list item. 
     The field you are trying to update may be read only. 

Para asegurarse que el campo MyEditor fue el que provocó la excepción, comenté la línea donde lo configuré y ejecuté el código nuevamente. Todo funcionó bien No entiendo lo que está mal, ¿alguien puede ayudarme?

+0

¿por qué cree que debería ser posible (y por qué es necesario que a los efectos normales)? No me gustaría que este tipo de campos sean editables ... Si está usando una cuenta que no sea de administrador para hacerlo y logra cambiar estos campos, me parece un error. –

+0

Creo que debería ser posible porque parece razonable que si configuro la propiedad ReadOnly de un campo como falso, debería poder escribir en él. Si no, ¿para qué sirve el campo ReadOnly? Estoy migrando los datos de un foro de discusión desde una base de datos diferente a Sharepoint, y quiero que el campo ModifiedBy refleje a la persona que originalmente lo publicó (a partir de ahora, muestra mi nombre en su lugar). Mi cuenta tiene derechos administrativos completos. –

Respuesta

1

ModifiedBy y CreadtedBy calculan automáticamente de autor y editor tiene que cambiar sólo los campos autor y editor de esta manera:

 using (var clientContext = new ClientContext(@"http://server")) 
     { 
      var web = clientContext.Web; 
      var lst = web.Lists.GetByTitle("Discus"); 

      var item = lst.GetItemById(2); 
      item["Author"] = 3; 
      item["Editor"] = 2; 
      item.Update(); 
      clientContext.ExecuteQuery();       

      Console.WriteLine("done"); 
     } 
+0

Estoy al tanto de esto. Funciona solo si los agrega un elemento y luego lo recupera con un GetItemById. Eso no tiene ningún sentido (que no es tu culpa). Me gustaría saber por qué no puedo modificar el campo MyEditor y hacerlo funcionar la primera vez que lo agregue. –

3

En caso de que alguien necesita para encontrar el usuario por su nombre, que dice así:

private static FieldUserValue GetUser(ClientContext clientContext, string userName) 
    { 
     var userValue = new FieldUserValue(); 
     var newUser = clientContext.Web.EnsureUser(userName); 
     clientContext.Load(newUser); 
     clientContext.ExecuteQuery(); 
     userValue.LookupId = newUser.Id; 
     return userValue; 
    } 

El valor devuelto puede definirse a través elemento [ "Autor"]

Cuestiones relacionadas