编辑:我意识到我在第二个代码块中的方法是不必要的。我可以通过在 ItemUpdated 中执行以下操作来完成同样的事情:
SPListItem thisItem = properties.ListItem;
thisItem.File.CheckOut();
thisItem["Facility Number"] = "12345";
thisItem.Update();
thisItem.File.CheckIn("force check in");
不幸的是,当“thisItem.Update();”时我仍然收到相同的错误消息 已执行:沙盒代码执行请求被拒绝,因为沙盒代码主机服务太忙,无法处理请求
实际上,在最初部署我的沙盒解决方案并使用此链接时,我收到了上述错误(http://blogs.msdn.com/b/sharepointdev/archive/2011/02/08/error-the-sandboxed-code-execution- request-was-refused-because-the-sandboxed-code-host-service-was-too-busy-to-handle-the-request.aspx) 来修复它。
我正在尝试编写一个 C# 事件接收器,当在库中添加/更改文档时,它会更改字段的值。我尝试使用以下代码:
public override void ItemUpdating(SPItemEventProperties properties)
{
base.ItemUpdating(properties);
string fieldInternalName = properties.List.Fields["Facility Number"].InternalName;
properties.AfterProperties[fieldInternalName] = "12345";
}
不幸的是,这仅适用于某些领域。例如,如果我将“Facility Number”替换为“Source”,代码将正确执行。这可能是因为我们正在使用第三方软件(称为 KnowledgeLake)将 SharePoint 中的默认编辑表单替换为 Silverlight 表单。无论如何,因为我在上面的代码中遇到了挑战(同样,因为我认为在 ItemUpdating 事件触发后 Silverlight 表单可能会覆盖该字段),所以我尝试了以下代码:
public override void ItemUpdated(SPItemEventProperties properties)
{
base.ItemUpdated(properties);
//get the current item
SPListItem thisItem = properties.ListItem;
string fieldName = "Facility Number";
string fieldInternalName = properties.List.Fields[fieldName].InternalName;
string fieldValue = (string)thisItem["Facility Number"];
if (!String.IsNullOrEmpty(fieldValue))
{
//properties.AfterProperties[fieldInternalName] = "123456789";
SPWeb oWebsite = properties.Web as SPWeb;
SPListItemCollection oList = oWebsite.Lists[properties.ListTitle].Items;
SPListItem newItem = oList.GetItemById(thisItem.ID);
newItem.File.CheckOut();
thisItem[fieldInternalName] = "12345";
thisItem.Update();
newItem.File.CheckIn("force");
}
}
首先,上面对我来说似乎有点笨拙,因为我很想只使用 AfterProperties 方法。此外,执行“newItem.Update()”时出现以下错误:沙盒代码执行请求被拒绝,因为沙盒代码主机服务太忙而无法处理请求
我在这里错过了什么吗?我很想利用第一个代码块。任何帮助,将不胜感激。