2012-07-12 3 views
5

Ich versuche, das "ModifiedBy" Feld in einer Sharepoint Diskussionsrunde mit dem Client Objektmodell zu aktualisieren. Durch Ändern der Felder "Editor" und "Autor" kann ich das "ModifiedBy" ändern, das in der Listenansicht angezeigt wird. Sobald Sie jedoch auf einen Diskussionsposten klicken, wird das dort angezeigte Feld "ModifiedBy" (das mit dem Bild darüber) die Änderungen nicht wiedergeben. Nach dem Experimentieren entdeckte ich, dass das Feld, das ich ändern muss, um dies zu korrigieren, "MyEditor" genannt wird. Leider ist dieses Feld schreibgeschützt.Sharepoint Client Objekt Modell Einstellung ModifiedBy Feld

In dem folgenden Code versuche ich, die schreibgeschützten Einstellungen des Felds in false zu ändern. Wenn ich das MyEditor-Feld in Visual Studio-Debugger nach der ExecuteQuery() - Zeile an dem unteren Rand des ersten Blocks anschaut, zeigt es, dass der ReadOnlyField-Wert tatsächlich auf False festgelegt worden ist.

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

Der obige Code wird ohne Probleme ausgeführt. Das Problem kommt mit diesem nächsten Block:

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

Wenn der Code die ExecuteQuery() am unteren Rande des zweiten Blockes erreicht, es wirft eine Serverexception mit der folgenden Meldung:

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

Um sicherzustellen, dass Da das MyEditor-Feld derjenige war, bei dem die Ausnahme ausgelöst wurde, habe ich die Zeile auskommentiert, in der ich sie gesetzt habe, und den Code erneut ausgeführt. Alles hat gut funktioniert. Ich verstehe nicht was falsch ist, kann mir jemand helfen?

+0

Warum denken Sie es möglich sein sollte eingestellt werden (und warum Sie sich für normale Zwecke müssen das)? Ich würde nicht erwarten, dass diese Art von Feldern editierbar ist ... Wenn Sie einen Nicht-Administrator-Account dazu benutzen und es schaffen, diese Felder zu ändern, fühlt es sich für mich wie ein Fehler an. –

+0

Ich glaube, es sollte möglich sein, weil es vernünftig erscheint, wenn ich die ReadOnly Eigenschaft eines Feldes auf false setze, sollte ich dazu schreiben können. Falls nicht, welchen Zweck erfüllt das ReadOnly-Feld? Ich migriere die Daten für ein Diskussionsforum aus einer anderen Datenbank in Sharepoint, und ich möchte, dass das Feld ModifiedBy die Person widerspiegelt, die es ursprünglich gepostet hat (momentan zeigt es stattdessen meinen Namen). Mein Konto hat volle administrative Rechte. –

Antwort

1

ModifiedBy und CreadtedBy berechnet automatisch von Autor und Editor Sie nur Autor und Editor Felder wie folgt ändern müssen:

 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

Ich bin mir dessen bewusst. Es funktioniert nur, wenn Sie sie Element hinzufügen und dann mit einer GetItemById abrufen. Das macht absolut keinen Sinn (was nicht deine Schuld ist). Ich würde gerne wissen, warum ich das MyEditor-Feld nicht ändern kann und es funktioniert, wenn ich es das erste Mal hinzufüge. –

3

Falls jemand den Benutzer nach dem Namen finden muss, ist es so geht:

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

Der Rückgabewert kann über item [ „Autor“]

Verwandte Themen