啟用審批的SharePoint列表,如果我們通過對象模型修改其中一條已批准的列 表項,Update後會導致該列表項回到待定狀態。不過好在對象模型裡有強大的 SystemUpdate,可以不動聲色的修改列表項。可是,如果你是通過SharePoint Web Service中的Lists.asmx的UpdateListItems進行的修改,就沒有這麼幸運了 。
引用SharePoint SDK中的描述:每個 Method 元素的 Cmd 屬性通過指定下列 值之一確定對項目執行的操作:
*Delete -- 刪除項。
*New -- 創建項。
*Update -- 修改項。
對於我們上面所說的情況,Cmd只能寫作“Update”。
網上常見的寫法如下:
1 <Batch OnError="Continue">
2 <Method ID="1" Cmd="Update">
3 <FIEld Name="ID">3634</Field>
4 <Field Name="FileRef">3634;#Lists/Fichesroyjs/3634_.000</Field>
5 <Field Name="_ModerationStatus">0</Field>
6 </Method>
7 </Batch>
修改文檔庫的審批狀態(無效)
可是,這樣運行的結果始終是待定。即使在更新中包含了<Field Name="_ModerationStatus">0</Field>也是一樣。或許你會想到Update 兩次,這裡可以直接告訴你結果,還是待定。
那麼到底如何添加或修改列表項,並且保證審批狀態為已審批呢?
答案最後是在論壇上找到的。通過Web Service執行審批時,應該使用 “Moderate”命令,而不是“Update”命令。
寫法如下:
1 <Batch>
2 <Method ID='1' Cmd='<strong>Moderate</strong>'>
3 <Field Name='ID'>6</Field>
4 <Field Name='<strong>_ModerationStatus</strong>'>0</Field> ;
5 </Method>
6 </Batch>
修改某列表中ID為6的列表項的審批狀態為“已批准”
下面附上一個完整的更新列表項並自動批准例子。其中最重要的還是 Cmd="Moderate"這一句:
01 public static XmlNode UpdateListItemApprove()
02 {
03 listservice.Lists listProxy = new listservice.Lists();
04 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>";
05 XmlDocument doc = new XmlDocument();
06 doc.LoadXml(xml);
07 XmlNode batchNode = doc.SelectSingleNode("//Batch");
08 listProxy.Url = "http://puremoss/it/_vti_bin/lists.asmx";
09 listProxy.UseDefaultCredentials = true;
10 XmlNode resultNode = listProxy.UpdateListItems("通知", batchNode);
11 return resultNode;
12 }
本例中,我們更新了通知列表中ID為167的項,將字段“是否發布到首頁”( 該欄的內部名稱為PublishToHomePage)改為“是”。由於該列表項之前已經被審 批通過,所以仍然要“保持”其審批狀態為“已批准”。
那麼再進一步,大膽猜測如果使用Moderate命令,但根本不更新審批狀態 (_ModerationStatus)為已批准。還會影響列表項的審批狀態嗎?
經過一番實驗,確定只要是使用Moderate命令,就不會對審批狀態有影響。因 此,上面代碼中的<Field Name='_ModerationStatus'>0</Field>完 全可以不寫!
有圖為證:
這是一條已批准的列表項(原本的狀態)
運行後更改了“是否發布到主頁”為是,但未影響其審批狀態
發現版本也沒有發生變化