【问题标题】:Cannot update document property on ItemAdded event when using Vista使用 Vista 时无法更新 ItemAdded 事件的文档属性
【发布时间】:2009-04-01 14:56:19
【问题描述】:

我们正在尝试创建一个自定义事件处理程序,该处理程序将在 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
         }


     }
 }

【问题讨论】:

    标签: sharepoint


    【解决方案1】:

    我们注意到发生了完全相同的事情。当 2007 文档添加到库中时,列表中的属性将添加到其中(空白)。

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

    然后到 2007 文档的内置属性映射启动并用 2007 文档中存储的值覆盖您的值(不会再次引发项目更新事件)。

    这意味着列表现在有一个空白列。

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

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

    我终生无法在 MS 网站上找到此信息,但这是一个已知问题。或许您可以在 SP2 中继续使用(甚至可能在 SP1 中修复,但不确定)。

    【讨论】:

      【解决方案2】:

      最后,我们联系了 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);
          }
      }
      

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 2015-11-08
          • 2015-04-12
          • 1970-01-01
          • 2011-02-27
          • 2012-12-11
          • 2020-10-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多