2012-07-12 127 views
5

我正在嘗試使用客戶端對象模型更新Sharepoint討論板中的「ModifiedBy」字段。通過更改「編輯器」和「作者」字段,我可以更改列表視圖上顯示的「ModifiedBy」。但是,一旦您點擊討論帖子,出現在那裏的「ModifiedBy」字段(圖片上方的圖片)就不會反映這些更改。經過試驗後,我發現我需要改變這個字段的名稱叫做「MyEditor」。不幸的是,這個字段是隻讀的。Sharepoint客戶端對象模型設置ModifiedBy字段

在下面的代碼中,我嘗試將該字段的只讀設置更改爲false。當我在第一個塊底部的ExecuteQuery()行之後查看Visual Studio調試器中的MyEditor字段時,它顯示ReadOnlyField值實際上已設置爲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(); 

上面的代碼執行沒有問題。問題就來了與此下一個塊:

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

當代碼到達的executeQuery()在第二塊的底部,它拋出的ServerException使用以下信息:

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

爲了確保MyEditor字段是導致拋出異常的字段,我將其設置並重新運行代碼的行註釋掉了。一切正常。我不明白什麼是錯,有人可以幫助我嗎?

+0

爲什麼你認爲它應該是可能的(爲什麼你會需要一個正常的目的)?我不希望這些類型的字段是可編輯的......如果您使用非管理員帳戶來這樣做並設法更改這些字段,那麼感覺就像是一個bug。 – 2012-07-12 21:10:37

+0

我認爲這應該是可能的,因爲如果我將字段的ReadOnly屬性設置爲false,我應該可以寫入它。如果不是,ReadOnly字段的用途是什麼?我將討論板的數據從不同的數據庫遷移到Sharepoint,並且我希望ModifiedBy字段反映最初發布它的人(因爲現在它顯示了我的名字)。我的帳戶擁有完整的管理權限。 – 2012-07-13 03:21:42

回答

1

ModifiedBy和CreadtedBy從作者和編輯器會自動計算出你只需要改變作者和編輯的字段是這樣的:

 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

我知道這一點。它只適用於你添加它們的項目,然後用GetItemById檢索它。這絕對沒有意義(這不是你的錯)。我想知道爲什麼我無法修改MyEditor字段,並在第一次添加它時使其工作。 – 2012-07-13 15:08:07

3

萬一有人需要找到名稱的用戶,它是這樣的:

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

返回值可以通過項目設置[「作者」]