通过SharePoint Web服务更新审批状态
启用审批的SharePoint列表,如果我们通过对象模型修改其中一条已批准的列表项,Update后会导致该列表项回到待定状态。不过好在对象模型里有强大的SystemUpdate,可以不动声色的修改列表项。可是,如果你是通过SharePoint Web Service中的Lists.asmx的UpdateListItems进行的修改,就没有这么幸运了。
引用SharePoint SDK中的描述:每个 Method 元素的 Cmd 属性通过指定下列值之一确定对项目执行的操作:
-
Delete -- 删除项。
-
New -- 创建项。
-
Update -- 修改项。
对于我们上面所说的情况,Cmd只能写作“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>
修改文档库的审批状态(无效)
可是,这样运行的结果始终是待定。即使在更新中包含了<Field Name="_ModerationStatus">0</Field>也是一样。或许你会想到Update两次,这里可以直接告诉你结果,还是待定。
那么到底如何添加或修改列表项,并且保证审批状态为已审批呢?
答案最后是在论坛上找到的。通过Web Service执行审批时,应该使用“Moderate”命令,而不是“Update”命令。
写法如下:
<Batch> <Method ID='1' Cmd='Moderate'> <Field Name='ID'>6</Field> <Field Name='_ModerationStatus'>0</Field> </Method> </Batch>
修改某列表中ID为6的列表项的审批状态为“已批准”
下面附上一个完整的更新列表项并自动批准例子。其中最重要的还是Cmd="Moderate"这一句:
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 = "http://puremoss/it/_vti_bin/lists.asmx"; listProxy.UseDefaultCredentials = true; XmlNode resultNode = listProxy.UpdateListItems("通知", batchNode); return resultNode; }
本例中,我们更新了通知列表中ID为167的项,将字段“是否发布到首页”(该栏的内部名称为PublishToHomePage)改为“是”。由于该列表项之前已经被审批通过,所以仍然要“保持”其审批状态为“已批准”。
那么再进一步,大胆猜测如果使用Moderate命令,但根本不更新审批状态(_ModerationStatus)为已批准。还会影响列表项的审批状态吗?
经过一番实验,确定只要是使用Moderate命令,就不会对审批状态有影响。因此,上面代码中的<Field Name='_ModerationStatus'>0</Field>完全可以不写!
有图为证:
这是一条已批准的列表项(原本的状态)
运行后更改了“是否发布到主页”为是,但未影响其审批状态
发现版本也没有发生变化
参考资料