【问题标题】:SharePoint 2010 Rename Document on Upload Fails in Explorer ViewSharePoint 2010 在资源管理器视图中上载失败时重命名文档
【发布时间】:2012-06-12 04:41:30
【问题描述】:

我正在尝试在 SharePoint 2010 中实现自定义,以便在将文档上载到库时,更改文件名以在名称中包含文档 ID。 (我知道人们不应该再担心文件名了,但是我们有很多已经命名的遗留文件和喜欢拥有本地副本的用户)。

我能够在 ItemAdded 事件上实现自定义事件接收器,通过在文件名前添加文档 ID 来重命名文件。这可以通过网络上传正常工作。

问题出在资源管理器视图上。当我尝试在资源管理器视图中使用 WebDAV 添加文件时,我得到了该文件的两个副本。似乎当文件通过网络上传时,触发的事件是

  1. 项目添加
  2. 项目已添加

但是当我将文件复制/粘贴到资源管理器视图中时,我会看到以下事件:

  1. 项目添加
  2. 项目已添加
  3. 项目添加
  4. 项目已添加
  5. 项目更新
  6. 项目已更新

结果是我有两个名称不同的文件(因为文档 ID 不同)。

我发现很多人在网上讨论这个问题(this 是我找到的最好的文章)。有人有其他想法吗?在工作流而不是事件接收器中执行此操作是否更有意义?我可以改用计划作业,但如果文档名称在几分钟后更改,用户可能会感到困惑。

这是我的代码,在使用网络上传时效果很好,但在使用资源管理器视图时效果不佳:

public override void ItemAdded(SPItemEventProperties properties)
{
   try
   {
       SPListItem currentItem = properties.ListItem;

       if (currentItem["_dlc_DocId"] != null)
       {
       string docId = currentItem["_dlc_DocId"].ToString();
       if (!currentItem["BaseName"].ToString().StartsWith(docId))
       {
           EventFiringEnabled = false;
           currentItem["BaseName"] = docId + currentItem["BaseName"];
           currentItem.SystemUpdate();
           EventFiringEnabled = true;
       }
       }
   }
   catch (Exception ex)
   {
       //Probably should log an error here
   }            
   base.ItemAdded(properties);
}

【问题讨论】:

    标签: sharepoint-2010


    【解决方案1】:

    我发现使用 Visual Studio 工作流可以让我最灵活地执行此操作。 SharePoint Designer 工作流会更简单,但更难部署到不同的网站和库。

    在阅读了包括thisthis 在内的一些好文章后,我想出了这个似乎可以工作的代码。它启动一个工作流并等到文档不在 LockState 中,然后处理文件名。

    工作流程如下所示:

    下面是代码:

    namespace ControlledDocuments.RenameWorkflow
    {
        public sealed partial class RenameWorkflow : SequentialWorkflowActivity
        {
            public RenameWorkflow()
            {
                InitializeComponent();
            }
    
            public Guid workflowId = default(System.Guid);
            public SPWorkflowActivationProperties workflowProperties = new SPWorkflowActivationProperties();
    
            Boolean continueWaiting = true;
    
    
            private void onWorkflowActivated1_Invoked(object sender, ExternalDataEventArgs e)
            {
                CheckFileStatus();
            }
    
            private void whileActivity(object sender, ConditionalEventArgs e)
            {
                e.Result = continueWaiting;
            }
    
            private void onWorkflowItemChanged(object sender, ExternalDataEventArgs e)
            {
                CheckFileStatus();
            }
    
            private void CheckFileStatus()
            {
                if (workflowProperties.Item.File.LockType == SPFile.SPLockType.None)
                {
                    continueWaiting = false;
                }
            }
    
            private void renameFile(object sender, EventArgs e)
            {
                try
                {
                    SPListItem currentItem = workflowProperties.Item;
    
                    if (currentItem["_dlc_DocId"] != null)
                    {
                        string docId = currentItem["_dlc_DocId"].ToString();
                        if (!currentItem["BaseName"].ToString().StartsWith(docId))
                        {
                            currentItem["BaseName"] = docId + currentItem["BaseName"];
                            currentItem.SystemUpdate();
                        }
                    }
                }
                catch (Exception ex)
                {
                    //Should do something useful here
                }
            }
    
        }
    }
    

    希望这可以帮助遇到同样问题的其他人。

    【讨论】:

      【解决方案2】:

      好吧,我会选择工作流程解决方法... imo 有 2 个选项:

      1) 在您的文档库中创建一个布尔字段,然后创建一个在添加项目时触发的 SPD 工作流,并将该字段设置为“已更改”或其他内容。然后在 EventReceiver 中检查该字段是否已设置..

      2) 使用 SPD 工作流程进行所有操作 - 像本示例中那样更改标题应该没问题。

      【讨论】:

      • 是的,似乎在工作流中处理这个是最好的选择。我已在我的代码中添加了答案,但感谢您的建议。
      • +1 用于发布如此详细的答案。它肯定会对其他人派上用场:-)
      猜你喜欢
      • 1970-01-01
      • 2010-10-24
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      • 1970-01-01
      • 2015-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多