1public class ListEventTest : SPItemEventReceiver
2 {
3 public override void ItemUpdated(SPItemEventProperties properties)
4 {
5 try
6 {
7 //using (SPWeb web = properties.OpenWeb())
8 //{
9 // SPList list = web.Lists["testlist"];
10 // SPListItem item = list.GetItemById(properties.ListItemId);
11 // item["Title"] = "updated_" + item["Title"].ToString();
12 // item.Update();
13 // System.Diagnostics.EventLog.WriteEntry("test event", item["Title"].ToString() + "is updated.");
14 //}
15 SPListItem item = properties.ListItem;
16 item["Title"] = "updated_" + item["Title"].ToString();
17 item.Update();
18 System.Diagnostics.EventLog.WriteEntry("test event", item["Title"].ToString() + "is updated.");
19 }
20 catch (Exception ex)
21 {
22 System.Diagnostics.EventLog.WriteEntry("test event", ex.ToString());
23 }
24 }
25 }
2 {
3 public override void ItemUpdated(SPItemEventProperties properties)
4 {
5 try
6 {
7 //using (SPWeb web = properties.OpenWeb())
8 //{
9 // SPList list = web.Lists["testlist"];
10 // SPListItem item = list.GetItemById(properties.ListItemId);
11 // item["Title"] = "updated_" + item["Title"].ToString();
12 // item.Update();
13 // System.Diagnostics.EventLog.WriteEntry("test event", item["Title"].ToString() + "is updated.");
14 //}
15 SPListItem item = properties.ListItem;
16 item["Title"] = "updated_" + item["Title"].ToString();
17 item.Update();
18 System.Diagnostics.EventLog.WriteEntry("test event", item["Title"].ToString() + "is updated.");
19 }
20 catch (Exception ex)
21 {
22 System.Diagnostics.EventLog.WriteEntry("test event", ex.ToString());
23 }
24 }
25 }
我以为是不同代码调用造成的,就像SPSecurity.RunWithElevatedPrivileges,结果使用注释掉和没有注释掉的代码实验,结果是一样的。
更新一次item系统事件记录了10次。
更新前样子:
更新后样子:
恩,就是10次。。。不知道您是否在意过这个地方呢,呵呵。
我想,是不是SPListItem的Update方法重新引发了ItemUpdated事件导致了死循环,而MOSS又有某种机制,使得这种循环只发生10次就退出。
当然,这只是我的猜想,没有真凭实据,如果您知道,麻烦您告诉我,谢谢。
这个问题的解决方法也是很简单,就是使用DisableEventFiring和EnableEventFiring这两个方法,在那篇文章中有说明,下面的留言也有参考URL,代码就象下面这样:
1SPListItem item = properties.ListItem;
2item["Title"] = "updated_" + item["Title"].ToString();
3this.DisableEventFiring();
4 item.Update();
5this.EnableEventFiring();
2item["Title"] = "updated_" + item["Title"].ToString();
3this.DisableEventFiring();
4 item.Update();
5this.EnableEventFiring();
更改代码后,再试,正常。
相关文章在这里:
http://www.sharepointsecurity.com/blog/sharepoint/sharepoint-2007-development/sp-event-recievers-firing-10-times-on-purpose/