2012-07-12 7 views
5

Sto tentando di aggiornare il campo "ModifiedBy" in un forum di discussione di SharePoint utilizzando il modello a oggetti client. Modificando i campi "Editor" e "Autore", posso modificare "ModifiedBy" che appare nella visualizzazione elenco. Tuttavia, dopo aver fatto clic su un post di discussione, il campo "ModifiedBy" che appare lì (quello con l'immagine sopra di esso) non riflette le modifiche. Dopo aver sperimentato, ho scoperto che il campo che ho bisogno di cambiare per correggerlo si chiama "MyEditor". Sfortunatamente, questo campo è di sola lettura.Impostazione modello oggetto client Sharepoint Campo ModifiedBy

Nel codice seguente, provo a modificare le impostazioni di sola lettura del campo su false. Quando guardo il campo MyEditor nel debugger di Visual Studio dopo la riga ExecuteQuery() nella parte inferiore del primo blocco, mostra che il valore ReadOnlyField è stato effettivamente impostato su false.

 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(); 

Il codice sopra viene eseguito senza problemi. Il problema viene con questo blocco successivo:

 //...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(); 

Quando il codice raggiunge l'ExecuteQuery() nella parte inferiore del secondo blocco, getta un ServerException con il seguente messaggio:

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

Per assicurarsi che il campo MyEditor era quello che faceva gettare l'eccezione, ho commentato la riga in cui l'ho impostata e ho eseguito di nuovo il codice. Tutto ha funzionato bene. Non capisco cosa c'è che non va, qualcuno può aiutarmi?

+0

perché pensi che dovrebbe essere possibile (e perché avresti bisogno che ai fini normali)? Non mi aspetto che questo tipo di campi sia modificabile ... Se si utilizza un account non amministratore per farlo e si riesce a modificare questi campi mi sembra un bug. –

+0

Credo che dovrebbe essere possibile perché sembra ragionevole che, impostando la proprietà ReadOnly di un campo su false, dovrei scrivere su di esso. In caso contrario, a cosa serve il campo ReadOnly? Sto migrando i dati per un forum di discussione da un altro database in Sharepoint, e voglio che il campo ModifiedBy rifletta la persona che l'ha pubblicata originariamente (al momento, mostra invece il mio nome). Il mio account ha diritti amministrativi completi. –

risposta

1

ModifiedBy e CreadtedBy calcolati automaticamente da autore ed editore è necessario cambiare solo autore ed editore campi come questo:

 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

Sono consapevole di questo. Funziona solo se si aggiunge loro l'elemento e quindi lo si recupera con un GetItemById. Ciò non ha assolutamente senso (che non è colpa tua). Mi piacerebbe sapere perché non posso modificare il campo MyEditor e farlo funzionare la prima volta che lo aggiungo. –

3

Nel caso in cui qualcuno ha bisogno di trovare l'utente in base al nome, va in questo modo:

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

Il valore restituito può essere impostato tramite il passo [ "Autore"]