使用Vista时无法在ItemAdded事件上更新文档属性

时间:2009-04-01 14:56:20

标签: sharepoint

我们正在尝试创建一个自定义事件处理程序,它将触发ItemAdded事件。然后,事件处理程序使用唯一ID值将文档更新到此文档库中的列。

我们的解决方案运行正常,除非Vista上的用户尝试从Office 2007保存新文档。在此方案中,文档存储到文档库,但唯一ID列为空,并且没有例外。

Vista用户可以毫无问题地将文档上传到库。其他一切在XP和Win2k3操作系统上运行良好。

有没有人见过类似的东西,这可能是什么问题?为了演示这个问题,我们使用DateTime.Now作为唯一ID。

 using Microsoft.SharePoint;

 public class TestReciever : SPItemEventReceiver
 {

     public override void ItemAdded(Microsoft.SharePoint.SPItemEventProperties properties)
     {

         try {
             DisableEventFiring();

             properties.ListItem("UniqueID Column") = DateTime.Now.ToString();
             properties.ListItem.SystemUpdate();

             EnableEventFiring();
         }
         catch (Exception ex) {
             // handle exception
         }


     }
 }

3 个答案:

答案 0 :(得分:1)

我们注意到发生了同样的事情。将2007 doc添加到库中时,列表中的属性将添加到其中(空白)。

然后调用(同步)事件处理程序,使用UniqueID列的正确值更新列表。

然后,映射到2007文档的内置属性将启动并使用存储在2007 doc中的值覆盖您的值(不再提高项目更新事件)。

这意味着列表现在的列空白。

如果您更改为异步事件,您可能会看到我们所做的事情以及异步的轻微延迟意味着首先发生到2007 docs的属性映射(我们认为)意味着值已正确存储。

可以打破列表和办公室之间的属性映射,但这只是一种解决方法。

我不能为我的生活找到这个信息在MS网站上的位置,但这是一个已知的问题。也许你可以在那里挂起SP2(甚至可能在SP1中修复,但我不确定)。

答案 1 :(得分:1)

最后我们联系了Microsoft,他们为我们提供了以下解决方案。这里的关键是在一个单独的线程中延迟项目更新。

private Guid listID;
private Guid itemID;
private Guid siteID;



public override void ItemAdded(Microsoft.SharePoint.SPItemEventProperties properties)
{
    DisableEventFiring();

    item = properties.ListItem;
    listID = properties.ListId;
    itemID = properties.ListItem.UniqueId;
    siteID = properties.SiteId;

    Threading.Thread setDocumentInternalIDThread = new Threading.Thread(SetInternalID);
    setDocumentInternalIDThread.Start();


    EnableEventFiring();
}


private void SetInternalID()
{
    try {

        Threading.Thread.Sleep(10000);
        using (SPSite site = new SPSite(siteID)) {
            using (SPWeb web = site.OpenWeb()) {

                SPList list = web.Lists(listID);
                SPListItem item = list.Items(itemID);

                item(Common.CustomID) = Common.GetAlphaPrefix() + Common.GetDocNumber();
                item.SystemUpdate();
            }

        }
    }
    catch (Exception ex) {

        Log(ex.Message);
    }
}

答案 2 :(得分:0)

另一种解决方法是将事件接收器中正在更新的自定义字段设置为只读(将字段ReadOnly属性设置为TRUE)。这有一些优点和缺点。这是唯一ID解决方案的理想选择,因为用户无法修改该值。但是,该字段对UI是隐藏的,因此管理它变得更麻烦,并且该字段不能用于标签或快速部件。您可以将字段的ShowInDisplayForm属性设置为TRUE,以使字段显示在视图窗体中,但不显示在编辑窗体中。该字段也可以添加到您的视图中。这是我迄今为止针对此问题找到的最佳解决方法。

这是Office 2007和WSS 3.0 xml解析器的问题。从Office 2007文档升级属性时,解析器会尝试将文档属性分配给SharePoint中的列表属性(属性提升)。问题是此事件发生在任何ItemAdded或ItemUpdated事件之后,因此该属性会被文档中的值覆盖,这当然是空白的。微软已将此作为一个错误提出,我希望在SP2中修复,但没有这样的运气。