我一直在尝试以编程方式重现在SharePoint网站管理屏幕中编辑内容类型的字段属性的行为,并使用WSS 3.0 Web服务的Webs.asmx“UpdateContentType”方法选择“必需”单选按钮而没有成功
第一个难点是MSDN文档的问题,即所述字段应该是FieldRef类型,而实际上它们必须是Field类型(reference)。修复后添加字段和删除字段工作正常,但更新字段似乎根本不起作用。 (还应该注意的是,我按照上一个链接上的建议使用Method="2"
来更新字段,但它没有任何改变,并且使用除1以外的方法值进行添加或使用除3以外的方法也可以正常运行)。
这是Web服务调用(为了便于阅读,稍微修改了字符串而不是XmlNode对象):
SharePointWebServices.Webs webService = new SharePointWebServices.Webs();
webService.Url = "http://mysharepointserver/site";
webService.UseDefaultCredentials = true;
webService.UpdateContentType(
@"0x01005A089D9EC8A382458FB1F6C72096D52A",
@"<ContentType />",
@"<Fields />",
@"<Fields><Method ID=""1""><Field Name=""SomeField"" ID=""{8a4803c4-6545-4a7a-804d-237eebff0ce3}"" Required=""TRUE"" Hidden=""FALSE"" ReadOnly=""FALSE"" PITarget="""" PIAttribute="""" PrimaryPIAttribute="""" Aggregation="""" Node="""" /></Method></Fields>",
@"<Fields />");
通话结束后,该字段仍然是必需=“FALSE”。
快速查看stssoap.dll程序集表明在更新过程中显然忽略了“Required”属性。这是正常的行为吗?如果是,那么从客户端代码(不在SharePoint服务器上执行)以编程方式更改“必需”字段的建议方法是什么?
非常感谢任何帮助。
答案 0 :(得分:2)
我对此进行了调查并发现了同样的事情。我还尝试将属性Cmd="Update"
添加到Method
元素但未成功。 This example如何使用UpdateContentType也很有帮助。
我不相信您可以使用开箱即用的SharePoint服务执行此操作。您已经通过查看stssoap.dll验证了这似乎无法正常工作。另一个“客户”风格的选项是使用RPC methods,但似乎根本没有提供内容类型的功能。
网络服务特别令人沮丧,因为这类不那么边缘的案例经常出现。我考虑使用它们是非常罕见的,因为浪费时间涉及它们的局限性。
您是否有任何选项将自定义代码部署到服务器?您可以使用对象模型开发此功能,并将其包装在您自己的自定义Web服务中(有一个walkthrough here)非常容易。
这是一个改编自Gabe Wishnie的例子,可满足您的需求:
SPContentType myContentType = myWeb.ContentTypes["myContentType"];
string internalName = myContentType.Fields["fieldToUpdate"].InternalName;
myContentType.FieldLinks[internalName].Required = false;
myContentType.Update(true);
对不起,这不是更有用,但在使用WSS 3.0 / SharePoint 2007 Web服务时这是一个常见的故事。