1

我的 VM 中有一个本地开发环境。(SharePoint server 2013 SP1,Visual Studio Ultimate 2013-update3)。我正在尝试将事件接收器添加到 ItemDeleting 上的文档库。将文档删除到 doc lib 会将项目添加到我的自定义列表“日志”中。我的编码如下:

事件.cs

  using System;
  using System.Security.Permissions;
  using Microsoft.SharePoint;
  using Microsoft.SharePoint.Utilities;
  using Microsoft.SharePoint.Workflow;

  namespace SharePointProject1.EventReceiver1
     {
     public class EventReceiver1 : SPItemEventReceiver
    {

    public override void ItemDeleting(SPItemEventProperties properties)
    {
        //base.ItemDeleting(properties);
        using (SPWeb web = properties.OpenWeb())
        {
            try
            {
                SPList list = web.Lists["Log"];
                SPListItem newItem = list.Items.Add();
                newItem["Title"] = properties.ListItem.Name;
                newItem["DateAndTime"] = System.DateTime.Now;
                newItem["Action"] = "Item Deleted";
                newItem.Update();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
   }

元素.xml

   <?xml version="1.0" encoding="utf-8"?>
   <Elements xmlns="http://schemas.microsoft.com/sharepoint/">
   <!-- <Receivers ListTemplateId="101" > -->
   <Receivers ListUrl ="Doclib"
   <Receiver>
  <Name>EventReceiver1ItemDeleting</Name>
  <Type>ItemDeleting</Type>
  <Assembly>$SharePoint.Project.AssemblyFullName$</Assembly>
  <Class>SharePointProject1.EventReceiver1.EventReceiver1</Class>
  <SequenceNumber>10000</SequenceNumber>
  </Receiver>
  </Receivers>
  </Elements>

Feature1.Template.xml

   <?xml version="1.0" encoding="utf-8" ?>
   <Feature xmlns="http://schemas.microsoft.com/sharepoint/">
    </Feature>

我在 SP 站点上部署了解决方案并激活了该功能。

所以我有两个问题,

  1. 当我使用代码 ListTemplateId="101" 时,我没有收到任何错误。但事件接收器没有触发。当我删除时,“日志”列表没有更新。我错过了什么吗?

  2. 如果我在 ListUrl 中提供文档库名称,则会出现错误

“部署步骤“激活功能”中发生错误:列表“Doclib”不存在。请修复 ListUrl 属性。

请就正确的方法提出建议。为什么事件接收器没有触发?

提前致谢。

4

2 回答 2

1

您是否希望此事件接收器为所有文档库触发。如果没有,最好的办法是在 sharepoint 项目的功能激活部分注册事件接收器。

public override void FeatureActivated(SPFeatureReceiverProperties properties) 
{ 
    SPWeb oWeb = (SPWeb)properties.Feature.Parent;    
    SPList list=oWeb.List["ListNameorDocLibName"];
    list.EventReceivers.Add(_theeventRecieverType, Assembly.GetExecutingAssembly           ().FullName, "EventReceiverProject1.EventReceiver1.EventReceiver1");
    list.Update();
}

如果你这样做,你不需要担心 URL 和事件接收器会定义触发。

于 2014-09-16T04:49:44.980 回答
0

我认为在这种情况下你需要解决两件事,

  1. 更新列表项后,还应更新列表本身,您还应该在更新列表之前使 web.allunsfaeupdates = true,并在更新列表项后使其为 false。

另一个问题是您已经注释掉了 //base.ItemDeleting(properties); 行。

请取消注释它可能会解决您的问题。

对于第二个问题,

它将需要列表的 URI 而不是列表名称生成列表的路径并提供它然后它将起作用。

让我知道结果

谢谢

于 2014-09-15T06:46:58.530 回答