2012-07-12 4 views
5

クライアントオブジェクトモデルを使用してSharepointディスカッションボードの "ModifiedBy"フィールドを更新しようとしています。 "Editor"と "Author"フィールドを変更することで、リストビューに表示される "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(); 

上記のコードは問題なく実行されます。問題は、この次のブロックが付属しています:確認するには

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

:第2ブロックの下部にある)

 //...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をスローしますMyEditorフィールドが例外をスローする原因になっていることを確認した後、私が設定した行をコメントアウトしてコードを再実行しました。すべてうまくいった。私は間違っていることを理解していない、誰かが私を助けることができますか?

+0

は、なぜあなたはそれが可能であるべきだと思います(と、なぜあなたは、通常の目的のためにそれを必要としますか)?私はこれらのタイプのフィールドが編集可能であるとは期待していません...管理者以外のアカウントを使用していて、これらのフィールドを変更すると、私にはバグのように感じます。 –

+0

フィールドのReadOnlyプロパティをfalseに設定すると、そのフィールドに書き込めるはずです。そうでない場合は、ReadOnlyフィールドの目的はどのような目的ですか?ディスカッションボードのデータを別のデータベースからSharepointに移行していますが、ModifiedByフィールドに最初に投稿した人が反映されるようにします(今のところ、代わりに自分の名前が表示されます)。私のアカウントには完全な管理者権限があります。 –

答えて

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フィールドを変更して初めて追加するときに、なぜそれを動作させることができないのか知りたいのですが。 –

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

返された値が[「著者」]項目で設定することができ