2012-07-12 12 views
5

Tôi đang cố gắng cập nhật trường "ModifiedBy" trong bảng thảo luận Sharepoint bằng cách sử dụng Mô hình đối tượng khách hàng. Bằng cách thay đổi trường "Trình chỉnh sửa" và "Tác giả", tôi có thể thay đổi "ModifiedBy" xuất hiện trên chế độ xem danh sách. Tuy nhiên, khi bạn nhấp vào một bài thảo luận, trường "ModifiedBy" xuất hiện ở đó (trường có hình bên trên nó) không phản ánh các thay đổi. Sau khi thử nghiệm, tôi phát hiện ra rằng trường tôi cần thay đổi để sửa lỗi này được gọi là "MyEditor". Thật không may, trường này là chỉ đọc.Sharepoint Client Object Model thiết lập trường ModifiedBy

Trong mã bên dưới, tôi cố gắng thay đổi cài đặt chỉ đọc của trường thành false. Khi tôi nhìn vào trường MyEditor trong trình gỡ rối của Visual Studio sau dòng ExecuteQuery() ở cuối khối đầu tiên, nó cho thấy giá trị ReadOnlyField trên thực tế đã được đặt thành 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(); 

Đoạn mã trên không thực hiện được bất kỳ sự cố nào. Vấn đề đi kèm với khối tiếp theo này:

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

Khi mã đạt ExecuteQuery() ở dưới cùng của khối thứ hai, nó ném một ServerException với thông báo sau:

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

Để đảm bảo rằng trường MyEditor là trường gây ra ngoại lệ được ném ra, tôi nhận xét ra dòng mà tôi đặt nó và chạy lại mã. Mọi thứ đều ổn. Tôi không hiểu những gì là sai, ai đó có thể giúp tôi?

+0

Tại sao bạn nghĩ người ta có thể (và tại sao bạn cần phải có cho mục đích bình thường)? Tôi sẽ không mong đợi những loại trường này có thể chỉnh sửa được ... Nếu bạn đang sử dụng tài khoản không phải quản trị viên để làm như vậy và quản lý để thay đổi các trường này, nó giống như một lỗi đối với tôi. –

+0

Tôi tin rằng điều đó có thể xảy ra vì có vẻ hợp lý nếu tôi đặt thuộc tính ReadOnly của một trường thành false, tôi có thể ghi vào đó. Nếu không, mục ReadOnly sẽ phục vụ mục đích gì? Tôi đang di chuyển dữ liệu cho một diễn đàn thảo luận từ một cơ sở dữ liệu khác vào Sharepoint và tôi muốn trường ModifiedBy phản ánh người đã đăng nó lần đầu tiên (ngay bây giờ, nó hiển thị tên của tôi). Tài khoản của tôi có toàn quyền quản trị. –

Trả lời

1

ModifiedBy và CreadtedBy tính tự động từ tác giả và biên tập viên bạn cần thay đổi chỉ tác giả và biên tập các lĩnh vực như thế này:

 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

Tôi biết điều này. Nó chỉ hoạt động nếu bạn thêm chúng và sau đó lấy nó với một GetItemById. Điều đó hoàn toàn không có ý nghĩa (đó không phải là lỗi của bạn). Tôi muốn biết tại sao tôi không thể sửa đổi trường MyEditor và làm cho nó hoạt động lần đầu tiên tôi thêm nó. –

3

Trong trường hợp ai đó cần tìm người dùng theo tên, nó đi như thế này:

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

Các giá trị trả về có thể được thiết lập thông qua mục [ "tác giả"]