Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SharePoint列表项事件处理程序_Sharepoint_Sharepoint 2010_Sharepoint 2007_Event Receiver_Splist - Fatal编程技术网

SharePoint列表项事件处理程序

SharePoint列表项事件处理程序,sharepoint,sharepoint-2010,sharepoint-2007,event-receiver,splist,Sharepoint,Sharepoint 2010,Sharepoint 2007,Event Receiver,Splist,我的SharePoint 2007项目中有以下场景。 我有计时器作业定义,每30分钟从SQL数据库表更新一次SharePoint列表 我还为我的列表添加了项目事件处理程序,因此它不允许用户从SharePoint用户界面向列表添加新项目。 换句话说,新列表项只能通过SharePoint对象模型添加到计时器作业定义中,并且不允许从UI添加新项 我的问题是-事件处理程序正在执行,即使它从计时器作业定义中添加了新项,我是否可以以某种方式在事件处理程序中检查该项是如何添加的(通过对象模型或通过用户界面)

我的SharePoint 2007项目中有以下场景。 我有计时器作业定义,每30分钟从SQL数据库表更新一次SharePoint列表

我还为我的列表添加了项目事件处理程序,因此它不允许用户从SharePoint用户界面向列表添加新项目。 换句话说,新列表项只能通过SharePoint对象模型添加到计时器作业定义中,并且不允许从UI添加新项

我的问题是-事件处理程序正在执行,即使它从计时器作业定义中添加了新项,我是否可以以某种方式在事件处理程序中检查该项是如何添加的(通过对象模型或通过用户界面)

非常感谢,,
Hrayr

为您提供两种选择

从计时器作业中插入标记

  • 在列表中设置一个标志,或者是像“AddedFromTimerJob”(可以从UI隐藏)这样的列,或者是在列表中添加一些内容
  • 在您的事件接收器中,检查标志/属性-如果存在,则让其通过,如果不存在,则拒绝

或者

首先,为什么不设置不允许添加新项目的权限,而不是在用户尝试将项目添加到列表后通过eventreceiver向用户提供错误

关于问题-可以临时禁用事件触发。例如,当计时器作业运行时,在完成之前禁用事件触发。但是,它可能不适用于所有情况,因为它将禁用列表中的所有事件接收器。但是,如果您没有任何事件接收器可以在ItemAdding/ItemAdded事件上添加数据,那么它就可以工作


这里可以找到禁用事件触发临时的代码:(它适用于任何事件,而不仅仅是更新)

您可以检查执行项目添加操作的用户帐户


如果
System.Threading.Thread.CurrentPrincipal.Identity
是运行计时器作业的帐户,请将SPEventPropertiesBase.Cancel设置为false

谢谢你的回复!是的,我也考虑了标志和禁用事件处理程序,但在这种情况下有一个大问题,例如我的计时器作业处理了100行,执行它需要很长时间,如果我设置了一些标志或禁用事件,那么在这段时间内,如果有人试图通过UI事件处理程序添加/更新项目,将不会被触发。我在想SPItemEventProperties中可能有一些属性可以告诉我们从标志触发的事件在哪里没有禁用它,只是让你的接收者接受它,所以没问题。根据第二个链接,提供的代码仅在插入线程时禁用它(即单个请求),然后重新启用它-因此再次没有问题。Ryan,再次非常感谢!最后一个问题,只是为了确保我答对了。因此,您提供的链接-如果我在某个进程之前禁用它,该进程需要3分钟来执行并添加大量新项目,然后在完成后启动它,,,在这种情况下,如果在这3分钟内,UI中的某个人将尝试将新项目添加到该列表中,事件将被触发,好吗?我说得对吗?这将是伟大的解决方案,如果我得到正确的!这就是我阅读代码和注释的方式——我还没有尝试过验证它。难道“禁用事件触发”不只是来自事件接收器吗?无论如何,在我看来,使用许可计划似乎是一种方式,除非有一些限制circumstance@Greg,权限方案将阻止用户添加项目。但关于事件接收器问题,您确实只能禁用事件接收器的事件触发。但是,不是每个事件接收器。因此,我们解决了创建一个继承SPItemEventReceiver的类并关闭(所有)事件接收器外部的事件接收器的问题:)