啟用審批的 SharePoint 列表,透過物件模型修改已批准項目並 Update 會導致項目回到「待定」狀態。物件模型有 SystemUpdate 可悄無聲息修改,但若用 Web Service Lists.asmx 的 UpdateListItems 則無此幸運。
SDK 指出 Method 元素 Cmd 屬性可為 Delete、New、Update。常見寫法包含 _ModerationStatus = 0 (已批准),但運行結果仍為「待定」。甚至嘗試 Update 兩次,依然無效。
<Batch OnError="Continue">
<Method ID="1" Cmd="Update">
<Field Name="ID">3634</Field>
<Field Name="FileRef">3634;#Lists/Fichesroyjs/3634_.000</Field>
<Field Name="_ModerationStatus">0</Field>
</Method>
</Batch>
論壇發現:透過 Web Service 執行審批時,應使用 "Moderate" 命令,而非 "Update"。
<Batch>
<Method ID='1' Cmd='Moderate'>
<Field Name='ID'>6</Field>
<Field Name='_ModerationStatus'>0</Field>
</Method>
</Batch>
public static XmlNode UpdateListItemApprove() {
listservice.Lists listProxy = new listservice.Lists();
string xml = "<Batch OnError='Continue'><Method ID='1' Cmd='Moderate'><Field Name='ID'>167</Field><Field Name='PublishToHomePage' Type='Boolean'>1</Field><Field Name=\"_ModerationStatus\" >0</Field></Method></Batch>";
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
XmlNode batchNode = doc.SelectSingleNode("//Batch");
listProxy.Url = "https://puremoss/it/_vti_bin/lists.asmx";
listProxy.UseDefaultCredentials = true;
XmlNode resultNode = listProxy.UpdateListItems("通知", batchNode);
return resultNode;
}
本例更新「通知」列表 ID 167 項,將「是否發布到首頁」改為「是」,並保持審批狀態為「已批准」。關鍵在 Cmd="Moderate"。
大膽猜測:若用 Moderate 但不更新 _ModerationStatus,是否影響審批狀態?實驗證實:只要用 Moderate 命令,就不會對審批狀態有影響。因此代碼中 <Field Name='_ModerationStatus'>0</Field> 完全可省略!
原本已批准
修改「發布到主頁」為是,審批狀態不變
版本號也未變化