2012-07-09 6 views
8

Tôi đang cố cập nhật trường siêu dữ liệu được quản lý SharePoint (MMD) bằng dịch vụ web Lists.UpdateListItems nhưng không hoạt động.Không thể cập nhật trường siêu dữ liệu được quản lý SharePoint 2010 với dịch vụ web Lists.UpdateListItems gọi

Đây là yêu cầu SOAP tôi

<?xml version="1.0" ?> 
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> 
<S:Body> 
    <UpdateListItems xmlns="http://schemas.microsoft.com/sharepoint/soap/"> 
    <listName>My Test List</listName> 
    <updates> 
     <Batch ListVersion="0" PreCalc="TRUE" OnError="Continue"> 
     <Method Cmd="Update" ID="1"> 
      <Field Name="ID">3</Field> 
      <Field Name="Document_x0020_Title">foo</Field> 
      <Field Name="Fiscal_x0020_Year1">13;#FY 2006|7e8205da-57a1-45a3-8147-469b795ad6e8</Field> 
     </Method> 
     </Batch> 
    </updates> 
    </UpdateListItems> 
</S:Body></S:Envelope> 

Yêu cầu này thành công sẽ cập nhật "Document Title" (một trường văn bản) nhưng lĩnh vực MMD, "tài chính năm", không thay đổi và không có lỗi trở về từ dịch vụ web.

Lưu ý rằng giá trị của MMD có định dạng "WssId; #TermValue | TermGuid" và thuật ngữ đã được tạo cho trang web.

Vui lòng trợ giúp.

Trả lời

9

Đã tìm ra.

Tôi phải sử dụng tên trường khác. Nhãn cho trường là "Năm tài chính", nhưng tên trường đã hoạt động thực sự là "d3c0ddc947ab4b8c90b6a0fe2d4caf09" thay vì "Fiscal_x0020_Year1". Vì vậy, yêu cầu SOAP của tôi sẽ như thế nào

<Method Cmd="Update" ID="1"> 
     <Field Name="ID">3</Field> 
     <Field Name="Document_x0020_Title">foo</Field> 
     <Field Name="d3c0ddc947ab4b8c90b6a0fe2d4caf09">13;#FY 2006|7e8205da-57a1-45a3-8147-469b795ad6e8</Field> 
    </Method> 

Để có được tên lĩnh vực này tôi sử dụng phương pháp Lists.GetListContentType dịch vụ web để trả về thông tin các lĩnh vực và tìm kiếm fieldtype "Ghi chú". Dưới đây là một ví dụ về những gì SharePoint trở

<Field Type="Note" DisplayName="Fiscal Year_0" 
StaticName="d3c0ddc947ab4b8c90b6a0fe2d4caf09" Name="d3c0ddc947ab4b8c90b6a0fe2d4caf09" 
ID="{1afa458b-d50a-4139-ad8d-f1172774de34}" ShowInViewForms="FALSE" Required="FALSE" 
CanToggleHidden="TRUE" SourceID="{77871b4e-f3ba-42dc-8940-ab33fb431099}" Hidden="TRUE" 
Version="1" Customization="" ColName="ntext8" RowOrdinal="0"/> 

Tôi cũng thấy hữu ích khi sử dụng phương pháp Lists.GetListContentTypes để có được những kiểu nội dung sử dụng id trong Lists.GetListContentType lời gọi phương thức.

---- Cập nhật - tôi thấy rằng bạn không cần phải sử dụng các định dạng của "WssId; #TermValue | TermGuid". Bạn chỉ có thể sử dụng "TermValue | TermGuid". Vì vậy, trong ví dụ trên giá trị sẽ là "FY 2006 | 7e8205da-57a1-45a3-8147-469b795ad6e8".

Điều này rất hữu ích vì bạn có thể tái sử dụng cùng một giá trị trên trang web khác với giá trị cũ, nơi bạn chỉ có thể sử dụng nó trong một trang web. Đối với nhiều giá trị, bạn chỉ cần phân định nó bằng dấu ";" thay vì ";#". Ví dụ: "FY 2006 | 7e8205da-57a1-45a3-8147-469b795ad6e8; FY 2007 | 823205da-57a1-45a3-8147-469b795ade13".

+0

Và khi bạn đặt trường - bạn có thể sử dụng toàn bộ phần Wssid. Giống như "FY 2006 | 7e8205da-57a1-45a3-8147-469b795ad6e8" –

0

Cảm ơn bạn đã đề cập đến bit về StaticName. Điều đó chấm dứt sự đau khổ của tôi.

Dường như đối với các trường đơn giản, không được liên kết với MMS, như Tiêu đề, cho phép cú pháp cập nhật dễ dàng hơn. Ví dụ, trên riêng của nó, cập nhật sau đây được xử lý mà không có lỗi.

<Field Name="Title">Some Title</Field> 

Tuy nhiên, quy tắc không giống với các trường được liên kết với MMS.
Theo cách tiếp cận ở trên, tôi đã chuyển sang các trường MMS của mình. Loại trường đó có thể được cập nhật với các giá trị tùy ý nếu bạn xác định nó bằng tên thân thiện và nhập số nguyên, ví dụ:

<Field Name="Activity">20</Field> 

"20" chỉ dịch sang một số cụm từ.
Tôi đã thử nhiều con số và tất cả chúng đều trở lại với cùng một thuật ngữ.

Hoặc, nếu tôi di chuyển đến gần hơn cách được cập nhật tài liệu, trong khi vẫn xác định trường bằng "Hoạt động", dịch vụ sẽ trả về lỗi 0x80020005.

<Field Name="Activity">HTA|fe951639-7c90-41ee-9888-6ae0e6523120</Field> 

Vì vậy, đừng làm vậy.
Chỉ khi mặt trăng được căn chỉnh hoàn toàn, tôi mới tìm thấy thành công. Tên miền là khóa.

<Field Name="j06a8d8240f84aec987f6a28effa3ae1">HTA|fe951639-7c90-41ee-9888-6ae0e6523120</Field> 

Một cách khác để tìm StaticName là tìm Loại trường = "Ghi chú" cho từng trường MMS trong phản hồi yêu cầu GetList. Thao tác này mất 1 đầu vào nhỏ hơn GetListContentType. Bạn chỉ cần tên danh sách chứ không phải contentTypeID.

Đá trên.